Winsock程式設計初步之<二> 源程式例項(一) (轉)
//A simplest server
//Written by Shen zhiliang for learning Winsock & HTTP
#include "winsock.h"
#include "stdio.h"
#include "conio.h"
#include "io.h"
#define BUFLEN 2048
#define DEFPATH ("C:frontpage webscontent")
#define DEFFILE ("INDEX.HTM")
#define HTTPHEAD ("HTTP/1.0 200 OK10Date: Monday,
04-Jan-99 17:06:17 GMTx0aServer: HTTP-Server/1.0x0a
MIME-version: 1.0x0a")
#define MIMEHTML ("Content-type: text/htmlx0a
Last-modified: Friday, 26-Sep-97 09:36:54 GMTx0a")
#define MIMEGIF ("Content-type: /image/gifx0a
Last-modified: Friday, 26-Sep-97 09:36:54 GMTx0a")
#define MIMEJPEG ("Content-type: /image/jpegx0a
Last-modified: Friday, 26-Sep-97 09:36:54 GMTx0a")
#define MIMEPAIN ("Content-type: text/painx0a
Last-modified: Friday, 26-Sep-97 09:36:54 GMTx0a")
#define HTMLHEAD ("
x0a")#define HTMLTAIL ("n")
void P(char * a)
{
printf("Error in : %sn",a);
}
/*
char * httphead(FILE * fp)
{
struct tm *newtime;
time_t aclock;
time( &aclock );
newtime = localtime( &aclock );
printf( "The current date and time are: %s",
asctime( newtime ) );
}
*/
void HtmlError(SOCKET s,unsigned int code,char * msg)
{
char tmp[1024];
sprintf(tmp,"Error code: %d %s",code,msg);
send(s,HTTPHEAD,strlen(HTTPHEAD),0);
send(s,HTMLHEAD,strlen(HTMLHEAD),0);
send(s,tmp,strlen(tmp),0);
send(s,HTMLTAIL,strlen(HTMLTAIL),0);
}
void SenFile(SOCKET s,char * filename)
{
FILE * fp;
char * tmp;
char fullname[512];
char buf[1024];
int i;
strcpy(fullname,DEFPATH);
if(strlen(filename)==0||(strlen(filename)==1&&
filename[0]=='/'))
strcat(fullname,DEFFILE);
else
{
do{
tmp=strchr(filename,'/');
if(tmp!=NULL)
tmp[0]='';
}while(tmp!=NULL);
if(filename[0]=='')
strcat(fullname,&filename[1]);
else
strcat(fullname,filename);
}
FILE * fpt=fopen("recv.dat","a+b");
fwrite(fullname,sizeof(char),strlen(fullname),fpt);
fclose(fpt);
fp=fopen(fullname,"rb");
if(fp==NULL)
{
char msg[512];
if(filename[0]=='')
filename[0]='/';
sprintf(msg," URI no found: %s",filename);
HtmlError(s,404,msg);
return;
}
send(s,HTTPHEAD,strlen(HTTPHEAD),0);
if(stricmp(&filename[strlen(filename)-4],".GIF")==0)
send(s,MIMEGIF,strlen(MIMEGIF),0);
else if(stricmp(&filename[strlen(filename)-4],".JPG")==0||
stricmp(&filename[strlen(filename)-5],".JPEG")==0)
send(s,MIMEJPEG,strlen(MIMEJPEG),0);
else if(stricmp(&filename[strlen(filename)-4],".HTM")==0||
stricmp(&filename[strlen(filename)-5],".HTML")==0)
{
send(s,MIMEHTML,strlen(MIMEHTML),0);
}
long fs=_filelength(_fileno(fp));
buf[0]=0;
sprintf(buf,"Content-length: %ldx0ax0a",fs);
send(s,buf,strlen(buf),0);
for(i=0;!feof(fp);i++)
{
buf[i]=fgetc(fp);
if(i>=1023||feof(fp))
{
send(s,buf,i,0);
i=0;
}
}
fclose(fp);
}
void SocketError(char * call)
{
fprintf(stderr," WinSock Error# function: %s, error code:%ldn",call,WSAGetLastError());
}
main(int argc,char ** argv)
{
int iRes,iPort,iTmp;
SOCKET s,rs;
SOCKADDR_IN sin,rsin;
WSADATA wsad;
wVersionReq;
char recvBuf[BUFLEN];
if(argc<2)
{
fprintf(stderr,"Usage: WebServer 999nt999 - Port
number for this server.");
return -1;
}
iPort=0;
iPort=atoi(argv[1]);
if(iPort<=0)
{
fprintf(stderr,"must specify a port number");
return -1;
}
wVersionReq=MAKEWORD(1,1);
iRes=Wtartup(wVersionReq,&wsad);
if(iRes!=0)
{
SocketError("WSAStartup()");
return -1;
}
s=socket(PF_,SOCK_STREAM,0);
if(s==INVALID_SOCKET)
{
SocketError("socket()");
return -1;
}
sin.sin_family=PF_INET;
sin.sin_port=htons(iPort);
sin.sin_addr.s_addr=INADDR_ANY;
iTmp=sizeof(sin);
if(bind(s,(LPSOCKADDR)&sin,iTmp)==SOCKET_ERROR)
{
SocketError("bind()");
closesocket(s);
WSACleanup();
return -1;
}
if(listen(s,1)==SOCKET_ERROR)
{
SocketError("listen()");
closesocket(s);
WSACleanup();
return -1;
}
fprintf(stderr,"WebServer Running......n");
iTmp=sizeof(rsin);
rs=0;
while(1)
{
if(_kbhit()!=0)
{
if(_getch()!=27)
break;
if(rc!=0)
closesocket(rs);
closesocket(s);
WSACleanup();
fprintf(stderr,"WebServer Stopped......n");
return 0;
}
rs=accept(s,(LPSOCKADDR)&rsin,&iTmp);
if(rs==INVALID_SOCKET)
{
SocketError("accept()");
closesocket(s);
WSACleanup();
return -1;
}
iRes=recv(rs,recvBuf,BUFLEN,0);
printf("RECEIVED DATA: n---------------------------------n%sn---------------------------------n",recvBuf);
if(iRes==SOCKET_ERROR)
{
SocketError("recv()");
closesocket(rs);
closesocket(s);
WSACleanup();
return -1;
}
char * sRes;
sRes=strstr(recvBuf,"GET");
if(sRes!=NULL&&(sRes-recvBuf)<3)
sRes=strchr(recvBuf,'/');
if(sRes!=NULL)
{
char * sRes1;
sRes1=strchr(sRes,'r');
if(strchr(sRes,' ') sRes1=strchr(sRes,' '); if(sRes1!=NULL&&(sRes1-sRes)<256) { char tmp[256]; strncpy(tmp,sRes,(sRes1-sRes)); tmp[sRes1-sRes]=0; int i; for(i=strlen(tmp)-1;(tmp[i]==' '||tmp[i]=='t')&&i>=0;i--) tmp[i]=0; for(i=0;tmp[i]==' '||tmp[i]=='t';i++); SendHtmlFile(rs,&tmp[i]); } }else { HtmlError(rs,202,"Bad request"); } closesocket(rs); } return 0; }
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10748419/viewspace-1001892/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- KafKa Java程式設計例項KafkaJava程式設計
- 設計模式例項程式碼設計模式
- Jmeter beanshell程式設計例項JMeterBean程式設計
- VC++視覺化程式設計第一個程式設計例項出錯C++視覺化程式設計
- 詳解Python物件導向程式設計之類、例項、方法Python物件程式設計
- LINUX Shell指令碼程式設計例項詳解(一)上Linux指令碼程式設計
- Linux程式設計之gdb(二)Linux程式設計
- 網頁倒數計時跳轉程式碼例項網頁
- Linux系統程式設計之程式間通訊方式:共享記憶體例項演示Linux程式設計記憶體
- shell script程式設計小結——附帶例項程式設計
- Spark程式設計環境搭建及WordCount例項Spark程式設計
- 玩轉 PHP 網路程式設計全套之 socket 選項設定 APIPHP程式設計API
- 好程式設計師Java培訓之類的例項化步驟程式設計師Java
- Matlab簡介與程式設計例項(一)(西北工業大MOOC)Matlab程式設計
- 玩轉 PHP 網路程式設計全套之 socket stream 程式設計PHP程式設計
- [翻譯]返回導向程式設計例項入門程式設計
- PHP程式碼審計03之例項化任意物件漏洞PHP物件
- div前後翻轉效果程式碼例項
- CSS3旋轉效果程式碼例項CSSS3
- 深入淺出Win32多執行緒程式設計--之綜合例項Win32執行緒程式設計
- 微控制器C程式設計例項指導pdfC程式程式設計
- makefile--偽目標語法與程式設計例項程式設計
- 初步瞭解C語言Windows程式設計C語言Windows程式設計
- 好程式設計師web前端分享在HTML中使用JavaScript例項程式碼程式設計師Web前端HTMLJavaScript
- JavaScript倒數計時程式碼例項JavaScript
- 《bash shell指令碼程式設計經典例項(第2版)》資源連結清單指令碼程式設計
- 程式設計注意事項程式設計
- Python - 物件導向程式設計 - 類變數、例項變數/類屬性、例項屬性Python物件程式設計變數
- Spring程式設計式和宣告式事務例項講解Spring程式設計
- MFC程式設計(二)C程式程式設計
- shell程式設計二程式設計
- 玩轉 PHP 網路程式設計全套之多程式程式設計PHP程式設計
- python 單一程式例項 實現Python
- Linux系統程式設計之程式間通訊方式:管道(二)Linux程式設計
- Rust 程式設計影片教程(進階)——010_2Box 使用例項Rust程式設計
- Python - 物件導向程式設計 - 例項方法、靜態方法、類方法Python物件程式設計
- FPGA二段式verilog程式碼例項FPGA
- 例項QT程式 —— Qt單例不規則介面程式QT單例
- Java併發程式設計中的設計模式解析(二)一個單例的七種寫法Java程式設計設計模式單例