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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Winsock程式設計初步之<三> 源程式例項(2) (轉)程式設計
- Winsock程式設計初步之<一> Winsock程式設計原理 (轉)程式設計
- XML程式設計例項(二) (轉)XML程式設計
- Winsock程式設計框架 (轉)程式設計框架
- DirectX 7 程式設計初步 (轉)程式設計
- TCP/IP Winsock程式設計要點(轉)TCP程式設計
- MapReduce程式設計例項之倒排索引 1程式設計索引
- MapReduce程式設計例項之自定義排序程式設計排序
- MapReduce程式設計例項之資料去重程式設計
- MapReduce程式設計例項之自定義分割槽程式設計
- Jmeter beanshell程式設計例項JMeterBean程式設計
- 設計模式例項程式碼設計模式
- KafKa Java程式設計例項KafkaJava程式設計
- DirectX5.0最新遊戲程式設計指南 DirectDraw教程篇 二、第一個DirectDraw例項 (轉)遊戲程式設計
- Android感測器程式設計帶例項(轉)Android程式設計
- Shell程式設計入門例項程式設計
- Qt 中Socket程式設計例項QT程式設計
- android socket程式設計例項Android程式設計
- The MySQL C API程式設計例項MySqlAPI程式設計
- Java&CORBA程式設計例項JavaORB程式設計
- corba程式設計簡單例項ORB程式設計單例
- Java XML程式設計例項解析JavaXML程式設計
- Java遊戲程式設計初步Java遊戲程式設計
- WinSock2程式設計之打造完整的SOCKET池程式設計
- VC++視覺化程式設計第一個程式設計例項出錯C++視覺化程式設計
- 多國語言程式設計之資源轉換 (轉)程式設計
- [C++]C++程式設計例項C++程式設計
- shell程式設計例項--實現累加程式設計
- 【Akka】Akka入門程式設計例項程式設計
- Delphi趣味程式設計例項三則程式設計
- 程式設計資源收集(轉)程式設計
- Linux 程式設計之Shell程式設計(轉)Linux程式設計
- 多程式程式設計函式posix_spawn例項程式設計函式
- Winsock錯誤程式碼一覽表 (轉)
- [轉]BDB例項程式碼
- 淺談Delpih中的windowsAPI程式設計初步(1)(轉)WindowsAPI程式設計
- 程式設計修養(二) (轉)程式設計
- c# winform程式設計轉例C#ORM程式設計