Winsock程式設計初步之<二> 源程式例項(一) (轉)

gugu99發表於2008-04-04
Winsock程式設計初步之 源程式例項(一) (轉)[@more@]

 

//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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章