一个静态web服务程序的问题

winnuke 2005-10-03 06:04:46
试着写着一个很简单的web服务程序,但是发现在访问量很多的时候,程序会发生错误,错误提示如下:


debug assertion failed!
program:f:\websrv\websrv.exe
file:fopen.c
line:54

expression:*file !=_T('\0')

代码如下:
#pragma comment(lib,"Ws2_32.lib")
#include<stdio.h>
#include<windows.h>

void main(void)
{int werror;
WSADATA wsadata;
SOCKET lisen;
SOCKET tran;
HOSTENT *host;
char hostname[128];
char recvmem[1024];
char *hostip;
struct sockaddr_in ip;

struct sockaddr_in serv_listen;
struct sockaddr_in client;
memset(&serv_listen,0,sizeof(struct sockaddr_in));
memset(&client,0,sizeof(struct sockaddr_in));
werror=WSAStartup(MAKEWORD(1,1),&wsadata);
if(werror!=0)
{printf("Load winsock dll failed!\n");
exit(0);
}

werror=gethostname(hostname,20);
if(werror==SOCKET_ERROR)
{printf("Get host name error!\n");
exit(0);
}

host=gethostbyname(hostname);
if(host==NULL)
{printf("Get host by name failed!\n");
exit(0);
}
ip.sin_addr.s_addr=inet_addr((char*)(host->h_addr_list[0]));
hostip=inet_ntoa(ip.sin_addr);

lisen=socket(AF_INET,SOCK_STREAM,6);
if(lisen==INVALID_SOCKET)
{printf("Create listen socket error!\n");
exit(0);
}

serv_listen.sin_addr.s_addr=inet_addr(hostip);
serv_listen.sin_family=AF_INET;
serv_listen.sin_port=htons(16881);

werror=bind(lisen,(struct sockaddr*)&serv_listen,sizeof(struct sockaddr));
if(werror==SOCKET_ERROR)
{printf("Bind error!\n");
exit(0);
}

werror=listen(lisen,5);
if(werror==SOCKET_ERROR)
{printf("Socket listen error!\n");
exit(0);
}

int clen=sizeof(struct sockaddr);

struct _SYSTEMTIME Time;
struct _SYSTEMTIME *ptr;
ptr=&Time;
GetSystemTime(ptr);

char headers[500];
char currenttime[50];
char hdrFmt[]=
"HTTP/1.0 200 OK\r\n"
"Server: KIKI's Web Server\r\n"
"Date: %s\r\n"
"Accept-Ranges: bytes\r\n"
"Content-Length: %d\r\n"
"Content-Type: text/html\r\n\r\n";
char ServTime[]="%d,%d/%d/%d %d:%d:00 GMT";

wsprintf(currenttime,ServTime,Time.wDayOfWeek,Time.wDay,Time.wMonth,Time.wYear,Time.wHour,Time.wMinute);

char download[]=
"HTTP/1.0 200 OK\r\n"
"Server: KIKI's Web Server\r\n"
"Date: %s\r\n"
"Accept-Ranges: bytes\r\n"
"Content-Length: %d\r\n"
"Content-Type: application/*\r\n\r\n";

FILE *fp;
char sendfile[65535];
char filename[50]="index.htm";
char tempname[10]="index.htm";
int i=0;
int j=0;
int k=0;
int len;

unsigned char c;
memset(sendfile,0,65535);




start:while(1)
{memset(headers,0,500);
memset(recvmem,0,1024);
memset(sendfile,0,65535);
k=0;

for(i=0;i<9;i++)
{filename[i]=tempname[i];
filename[i+1]='\0';
}
tran=accept(lisen,(struct sockaddr*)&client,&clen);
if(tran==INVALID_SOCKET)
{printf("Accept error!\n");
goto start;
}
werror=recv(tran,recvmem,1024,0);
GetSystemTime(ptr);
wsprintf(currenttime,ServTime,Time.wDayOfWeek,Time.wDay,Time.wMonth,Time.wYear,Time.wHour,Time.wMinute);

if(recvmem[5]!=32)
{memset(filename,0,50);
for(i=5;recvmem[i]!=32;i++)
filename[i-5]=recvmem[i];
}



fp=fopen(filename,"rb");
if(fp==NULL)
{printf("open file: %s error!\n",filename);
printf("--------------------------------------------------------------------------------");
closesocket(tran);
goto start;
}
for(i=0;i<50;i++)
if((filename[i]==':')||(filename[i]=='*')||(filename[i]=='%'))
{printf("%s%s企图请求的页面文件:%s.文件大小:%d字节\n\n",currenttime,inet_ntoa(client.sin_addr),filename,i);
printf("\n--------------------------------------------------------------------------------");
closesocket(tran);
goto start;
}



i=0;
while(c=fgetc(fp),!feof(fp))
i++;
j=i/65535;

len=strlen(filename);
if((filename[len-3]=='e'&&filename[len-2]=='x'&&filename[len-1]=='e')||\
(filename[len-3]=='r'&&filename[len-2]=='a'&&filename[len-1]=='r')||\
(filename[len-3]=='z'&&filename[len-2]=='i'&&filename[len-1]=='p'))
wsprintf(headers, download, (const char*)currenttime, i);
else
{wsprintf(headers, hdrFmt, (const char*)currenttime, i);}

printf("\n%s",recvmem);
printf("%s",headers);
printf("%s%s请求的页面文件:%s.文件大小:%d字节\n\n",currenttime,inet_ntoa(client.sin_addr),filename,i);
printf("\n--------------------------------------------------------------------------------");

send(tran,headers,strlen(headers),0);
fseek(fp,0,0);
for(i=0;i<=j;i++)
{while(c=fgetc(fp),!feof(fp))
{sendfile[k]=c;
k++;
if(k==65535)
{k=0;
break;}
}
send(tran,sendfile,65535,0);
}
closesocket(tran);
}

}
...全文
75 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
sevencat 2005-10-03
  • 打赏
  • 举报
回复
no ask othres to debug for U,do it by yourself

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧