试着写着一个很简单的web服务程序,但是发现在访问量很多的时候,程序会发生错误,错误提示如下:
debug assertion failed!
program:f:\websrv\websrv.exe
file:fopen.c
line:54expression:*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);
 }
 
}