免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4169 | 回复: 4
打印 上一主题 下一主题

[网络] Connection reset by peer, send error [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-08-16 12:30 |只看该作者 |倒序浏览
本帖最后由 liuchang8877 于 2012-08-16 12:31 编辑

1,客户端发送,服务端接收
发送时 收到Connection reset by peer
2,单是 服务端 隐去  接收完数据写入共享内存这块代码,客户端就不会报错
3,服务端的例子是WRichardStevens   UNP   有关 select()  讲解时的例子,除了 共享内存写入这块自己 添加的

希望大牛给点指点
  1. int i = 0,maxi = 0,maxfd = -1;
  2.     int listenfd = -1,connfd = -1,sockfd  = -1;
  3.     int nready,client[FD_SETSIZE];
  4.     ssize_t n = 0;
  5.     fd_set rset,allset;
  6.     char buf[CARD_DATA_SIZE];
  7.     socklen_t clilen;
  8.     struct  sockaddr_in cliaddr,servaddr;
  9.     int bind_re = -1, listen_re = -1;
  10.     char  cTemp[CARD_DATA_SIZE];
  11.     char  cMiddleBuff[CARD_DATA_SIZE*2];
  12.     long  lMiddLen = 0;
  13.     int   iWriteCacheSuccess = 0;
  14.     int   result;
  15.     memset(cTemp,0,CARD_DATA_SIZE);
  16.     memset(cMiddleBuff,0,CARD_DATA_SIZE*2);


  17.     memset(buf,0,CARD_DATA_SIZE);

  18.     listenfd = socket(AF_INET,SOCK_STREAM,0);
  19.     memset(&servaddr,0,sizeof(servaddr));
  20.     servaddr.sin_family = AF_INET;
  21.     servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
  22.     servaddr.sin_port = htons(21000);

  23.     printf("listenfd:%d\n",listenfd);
  24.     bind_re = bind(listenfd,(struct sockaddr*)&servaddr,sizeof(servaddr));
  25.     if(bind_re < 0){
  26.         printf("bind error:%s\n",strerror(errno));
  27.         exit(1);
  28.     }
  29.     printf("bind_re :%d\n",bind_re);

  30.     listen_re = listen(listenfd,LISTENQ);
  31.     if(listen_re < 0){
  32.         printf("listen error:%s\n",strerror(errno));
  33.         exit(1);
  34.     }printf("listen_re:%d\n",listen_re);

  35.     maxfd = listenfd;
  36.     maxi = -1;
  37.     for(i = 0 ; i < FD_SETSIZE; i++){
  38.         client[i] = -1;
  39.     }
  40.     FD_ZERO(&allset);
  41.     FD_SET(listenfd,&allset);

  42.     for(;;){
  43.         /*change*/
  44.         //bcopy(&rset,&allset,sizeof(allset));
  45.         rset = allset;
  46.         printf("select...\n");
  47.         nready = select(maxfd+1,&rset,NULL,NULL,NULL);

  48.         if(FD_ISSET(listenfd,&rset)){
  49.             clilen = sizeof(cliaddr);
  50.             connfd = accept(listenfd,(struct sockaddr*)&cliaddr,&clilen);
  51.             printf("accept :connfd:%d\n",connfd);
  52.             for(i = 0; i < FD_SETSIZE; i++){
  53.                 if(client[i] < 0){
  54.                     client[i] = connfd;
  55.                     break;
  56.                 }
  57.             }

  58.         if(i == FD_SETSIZE){
  59.             printf("too many clients");
  60.             exit(1);
  61.         }

  62.         FD_SET(connfd,&allset);
  63.         if(connfd > maxfd){
  64.             maxfd = connfd;
  65.         }
  66.         if(i > maxi)
  67.             maxi = i;
  68.         if(--nready <= 0)         continue;
  69.         }//FD_ISSET

  70.     for(i = 0; i <= maxi; i++){
  71.         if((sockfd = client[i]) < 0)
  72.             continue;
  73.         if(FD_ISSET(sockfd,&rset)){
  74.             if((n = recv(sockfd,buf,CARD_DATA_SIZE,0)) == 0){
  75.                 close(sockfd);
  76.                 FD_CLR(sockfd,&allset);
  77.                 client[i] = -1;
  78.             }else{
  79.                 printf("ok\n,result:%d\n",n);
  80.                  /*this this to  write data to my Ringshm*/
  81.                  /*if i donot save it in the Ring Shm */
  82.                  /*the client will not get the error*/
  83.                 memcpy(cMiddleBuff+lMiddLen,buf,n);
  84.                 lMiddLen += n;
  85.                 if(lMiddLen > CARD_DATA_SIZE){
  86.                     do{
  87.                             iWriteCacheSuccess =
  88.                             writeRingShm(semId[pchannel->cardid],
  89.                                        buffer[pchannel->cardid],
  90.                                         (char *)cMiddleBuff,CARD_DATA_SIZE);
  91.                     }while(0 == iWriteCacheSuccess);
  92.                     memcpy(cTemp,cMiddleBuff+CARD_DATA_SIZE,
  93.                            lMiddLen - CARD_DATA_SIZE);
  94.                     memcpy(cMiddleBuff,cTemp,lMiddLen - CARD_DATA_SIZE);
  95.                     lMiddLen -= CARD_DATA_SIZE;
  96.                 }
  97.             }

  98.             if(--nready <= 0)
  99.                 break;

  100.         }//FD_ISSET
  101.     }//for
  102. }//for(;;)
复制代码

论坛徽章:
0
2 [报告]
发表于 2012-08-16 13:13 |只看该作者
自己顶顶  唉没人

论坛徽章:
0
3 [报告]
发表于 2012-08-16 14:44 |只看该作者
问题找到了。  不是 socket  连接的事情,是因为服务端 的异常 导致的  ,导致 客户端 得到  connect reset by peer 的报错

论坛徽章:
0
4 [报告]
发表于 2012-08-16 20:38 |只看该作者
生活中绝大部分问题最后还是得靠自己解决。

论坛徽章:
0
5 [报告]
发表于 2012-08-17 14:49 |只看该作者
回复 4# _Rayx
是滴呀。。。


   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP