免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: sunceenjoy
打印 上一主题 下一主题

模拟web服务器,出现 Connection reset by peer ,请教 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2010-03-18 20:07 |只看该作者
char *str = "HTTP/1.1 200 OK\n"

"Content-Length: 10\n"

"Content-Type: text/html;charset=gbk\n\n"

"1234567890";
====================
你加一个属性:
Connection:   Close

这个是告诉请求端服务器这边主动关闭!

论坛徽章:
0
12 [报告]
发表于 2010-03-22 18:39 |只看该作者
正好本人也在看这方面的东西,一起交流一下:
1.楼主“lighttpd的watcher,worker模型 不会导致所谓的群惊(也许应当叫‘惊群’?)现象。”

论坛徽章:
0
13 [报告]
发表于 2010-03-22 18:47 |只看该作者
对不起,按错了键,接着上面:
所谓‘惊群’,是因为多个进程同时listen同一个socket造成的,潜在的有这个可能,并不代表在某个个案中一定会出现,楼主下这个结论缺乏依据。个人认为,既然lighttpd的watcher,worker模型存在这种潜在的风险,而且,事实上即使有多个进程能够listen到同一个socket,但仅能有一个可以成功accept,所以这备受推崇的watcher,worker模型其实很值得怀疑。但愿我是发现皇帝的新装的那个儿童。

论坛徽章:
0
14 [报告]
发表于 2010-03-22 18:56 |只看该作者
2.个人认为楼主select那段代码使用上有点问题。本质上,select是为了实现多路复用,但楼主的代码在这里没有起到这个作用,去掉它也是一样的。
以上是个人拙见,有问题大家讨论。

论坛徽章:
0
15 [报告]
发表于 2010-03-22 19:09 |只看该作者
3.下面借楼主的话题求教一个问题,也是模拟一个WEB服务器,代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>      // bzero
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>  
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

int get_index_name(char *name, char *file)
{
struct stat buf;
mode_t isdir = 16895;
FILE *fp;
char a;
char name_dir[256] = "\0";
char name_temp[256] = "\0";
char index_path[256] = "\0";
int i=0,j=0,k=0;
char defult[4][64] = {{"index.html"},{"index.htm"},{"default.htm"},{"default.html"}};
while((name[i] != '\n') && (name[i] != '\r')){
  i++;
  j++;
}//read the first line
for (i=0; i<j; i++)
{
  if(*(name+i) == '/')
  {
   a=*(name+i+1);
   if((int)(a) == 32)
   {
    for (j=0; j<4; j++)
    {
     //strcpy(index_path, "/mnt/hgfs/share/http/";
     strcpy(index_path, "./";
     strcat(index_path, &defult[j-1][64]);
     if ((fp = fopen(index_path, "r") != NULL)
     {
     // strcpy(file, &defult[j-1][64]);
      strcpy(name, index_path);
      return 0;
     }
    }
    return -1;
   }
   else
    break;
  }
}
for (k=0; k<(j-i); k++){
  if (name[k+i+1] != ' ')
  {
   name_temp[k] = name[k+i+1];
   name_temp[k+1] = '\0';
  }
  else
  {
   //strcpy(name_dir, "/mnt/hgfs/share/http/";
   strcpy(name_dir, "./";
   strcat(name_dir, name_temp);
   strcpy(file, name_temp);
//   printf("file=%s\n",file);
   stat(name_dir, &buf);
   if (buf.st_mode == isdir)
   {
    if (name_temp[strlen(name_temp)-1] == '/'){
     for (j=0; j<4; j++)
     {
      strcpy(index_path, name_dir);
      strcat(index_path, &defult[j-1][64]);
      if ((fp = fopen(index_path, "r") != NULL)
      {
       strcpy(name, index_path);
       return 0;
      }
     }
     return -1;
    }
    else
     return -301;
   }
//   strcpy(file, name_temp);
   //strcpy(name, "/mnt/hgfs/share/http/";
   strcpy(name, "./";
   strcat(name, name_temp);
   return 0;
  }
}
return -1;
}

int main()
{
int fd;
int strLen;
char recvbuf[1024] = "\0";
char sendbuf[51200] = "\0";
int sockfd;
int ret;
struct sockaddr_in servAddr;
unsigned short port = 8000;
char index_name[1024] = "\0";
char ok_info[] = "HTTP/1.1 200 OK\r\nConnection: Keep-alive\r\n\r\n";
// char err_info[] = "HTTP/1.1 404 Not Found\r\n\r\n<HTML><BODY>File Not Found!</BODY></HTML>";
char move_info[256] = "HTTP/1.1 301 Moved Permanently\r\nLocation:";
char file[256] = "\0";

char cliIP[500];
struct sockaddr_in cliAddr;
int cliAddrLen = sizeof(cliAddr);

int connfd;


        sockfd=socket(AF_INET,SOCK_STREAM,0);
        if ( sockfd<0 )
        {
                perror("socket err!";
                return -1;
        }
         


bzero(&servAddr, sizeof(servAddr));
servAddr.sin_family = AF_INET;
servAddr.sin_port = htons(port);
servAddr.sin_addr.s_addr = htonl(INADDR_ANY);
if(bind(sockfd, (struct sockaddr*)&servAddr, sizeof(struct sockaddr)) != 0)
{
  close(sockfd);
  perror("binding err!";
  exit(1);
}
if(listen(sockfd, 1) != 0)
{
  close(sockfd);
  perror("listen err!");
  exit(1);
}
printf("waiting client...\n");


//while (1){

                //memset(&cliaddr,0,sizeof(struct sockaddr));
                //len=sizeof(struct sockaddr_in);
                //if( ( child_socket=accept(sock,(struct sockaddr *)&cliaddr,&len) ) < 0 )

  connfd = accept(sockfd, (struct sockaddr*)&cliAddr, &cliAddrLen);
  if(connfd < 0)
  {
   close(sockfd);
   perror("accept err!");
   exit(1);
  }
  
while (1){


  inet_ntop(AF_INET, &cliAddr.sin_addr.s_addr, cliIP, sizeof(cliAddr));
  printf("client ip = %s\n", cliIP);
  bzero(recvbuf, 1024);
  //read(connfd, recvbuf, 204;
  
    if(read(connfd, recvbuf, 204 < 0)
  {
   close(sockfd);
   perror("read err!");
   exit(1);
  }
  printf("recvbuf:%s\n",recvbuf);
  if (strncmp(recvbuf, "GET ", 4) < 0){
   strcpy(recvbuf,"<HTML><BODY>Unknow Type!<BODY><HTML>");
   write(connfd, recvbuf, strlen(recvbuf));
   close(connfd);
   continue;
  }
  strcpy(index_name, recvbuf);
  if ((ret = get_index_name(index_name, file)) < 0)
  {
   if (ret == -301){
    strcat(move_info, file);
    strcat(move_info, "/\r\n\r\n");
    printf("%s\n",move_info);
    write(connfd, move_info, strlen(move_info));
    strcpy(recvbuf,"<HTML><BODY>Not Found! 301 ERROR! <br /><br />lease check your address!</BODY></HTML>");
    write(connfd, recvbuf, strlen(recvbuf));
    close(connfd);
    continue;
   }
   strcpy(recvbuf,"<HTML><BODY>Not Found! 404 ERROR! <br /><br />lease check your address!</BODY></HTML>");
   write(connfd, recvbuf, strlen(recvbuf));
   close(connfd);
   continue;
  }
  
  printf("文件名:%s\n",index_name);
  if ((fd = open(index_name,O_RDONLY)) < 0){
   strcpy(recvbuf,"<HTML><BODY>Not Found! 404 ERROR!<br /><br />lease check your address!</BODY></HTML>");
   write(connfd, recvbuf, strlen(recvbuf));
   close(connfd);
   continue;
  }
  printf("===write===\n");
  write(connfd, ok_info, strlen(ok_info));
  printf("ok_info:%s\n",ok_info);
  while((strLen = read(fd, sendbuf, 51200)) > 0){
   write(connfd, sendbuf, strLen);
   bzero(sendbuf, strLen);
   
   
   printf("-------------------------------------\n");
  }
  //close(connfd);
}

close(connfd);
return 0;
}

本人找这段代码是为了测试长连接,用IE,但每到第二次请求都会出错退出,在read时出现"connection reset by peer".
如果将accept那段和关闭close(connfd);包含在while循环之内一切正常,可这时就成了短连接。
各位大侠,能不能帮忙解惑?方便的话QQ:448750215,或EMAIL:jzduan@126.com

论坛徽章:
0
16 [报告]
发表于 2010-03-22 19:12 |只看该作者
或者,是本人对“长连接”的理解有问题?

论坛徽章:
0
17 [报告]
发表于 2010-03-24 08:55 |只看该作者
已解决。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP