CSDN博客

img cnviolet

Winsock程序设计初步之<二> 源程序实例(一)

发表于2001/5/13 17:35:00  792人阅读

分类: Visual C++

 

//A simplest web server

//Written by Shen zhiliang for learning Winsock & HTTP

file://zhiliang@sina.com

 

#include "winsock.h"

#include "stdio.h"

#include "conio.h"

#include "io.h"

#define BUFLEN 2048

#define DEFPATH ("C://frontpage webs//content//")

#define DEFFILE ("INDEX.HTM")

#define HTTPHEAD ("HTTP/1.0 200 OK/010Date: Monday,

04-Jan-99 17:06:17 GMT/x0aServer: HTTP-Server/1.0/x0a

MIME-version: 1.0/x0a")

#define MIMEHTML ("Content-type: text/html/x0a

Last-modified: Friday, 26-Sep-97 09:36:54 GMT/x0a")

#define MIMEGIF ("Content-type: /image/gif/x0a

Last-modified: Friday, 26-Sep-97 09:36:54 GMT/x0a")

#define MIMEJPEG ("Content-type: /image/jpeg/x0a

Last-modified: Friday, 26-Sep-97 09:36:54 GMT/x0a")

#define MIMEPAIN ("Content-type: text/pain/x0a

Last-modified: Friday, 26-Sep-97 09:36:54 GMT/x0a")

#define HTMLHEAD ("<html><body>/x0a")

#define HTMLTAIL ("/n</body></html>")

void P(char * a)

{

printf("Error in : %s/n",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 SendHtmlFile(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: %ld/x0a/x0a",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:%ld/n",call,WSAGetLastError());

}

main(int argc,char ** argv)

{

int iRes,iPort,iTmp;

SOCKET s,rs;

SOCKADDR_IN sin,rsin;

WSADATA wsad;

WORD wVersionReq;

char recvBuf[BUFLEN];

if(argc<2)

{

fprintf(stderr,"Usage: WebServer 999/n/t999 - 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=WSAStartup(wVersionReq,&wsad);

if(iRes!=0)

{

SocketError("WSAStartup()");

return -1;

}

s=socket(PF_INET,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%s/n---------------------------------/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)

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;

}

 

阅读全文
0 0

相关文章推荐

img
取 消
img