免费注册 查看新帖 |

Chinaunix

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

socket网络编程的select控制问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-05-15 14:54 |只看该作者 |倒序浏览
前提描述:服务器和客服端对发文件,文件大小可能不一样,现在还主要是一对一的。
问题:能正确连接,同时可以传送,但是在较小文件的最后一次传完后(这里传送比接收快,发送接受模型看代码最后),
select依然认为FD_ISSET(fd_A[cyc], &wset)可以,从而导致继续调用SEND_Fun()函数,但是没赋值,
  导致总是出现Broken pipe。
   如果在while()循环前面加上一个 signal(SIGPIPE,SIG_IGN)则可以继续接收资料,此时
显示SEND_Fun()函数返回值是<=0;
   如果不加上 signal(SIGPIPE,SIG_IGN),则会出现死在SEND_Fun()中的send()中   


while(1)
{
FD_ZERO(&rset);
FD_ZERO(&wset);
FD_SET(ser_sockfd,&rset);
FD_SET(ser_sockfd,&wset);
maxfd=ser_sockfd;
timeout.tv_sec=2;
timeout.tv_usec=500000;

for(cyc=0;cyc<LISTEN_QUEUE_NUM;cyc++)
{
if(fd_A[cyc]!=0)
{
FD_SET(fd_A[cyc],&rset);
FD_SET(fd_A[cyc],&wset);
if(fd_A[cyc]>maxfd)
{
maxfd=fd_A[cyc];
}
printf("fd_A[%d]__still active\n",cyc);
added_fd++;
}
}
maxfd=maxfd+1;

if( (ret=select(maxfd,&rset,&wset,(fd_set*)NULL,&timeout)) <0)
{
perror("wrong select\n");
return(-1);
}

else if(ret==0)
{
printf("selecting and waiting\n");
continue;
}

if( (FD_ISSET(ser_sockfd,&rset))|| (FD_ISSET(ser_sockfd,&wset)) )
{
int len_2=sizeof(cliaddr);
if((nsock= accept(ser_sockfd ,(struct sockaddr *)&cliaddr,(uint32_t *)&len_2) )<=0)
{
perror("ERROR on accept\n");
continue;
}
   if (added_fd < LISTEN_QUEUE_NUM)
   {
   for(cyc=0;cyc<LISTEN_QUEUE_NUM;cyc++)
   {
   if(fd_A[cyc]==0)
   {
   fd_A[cyc]=nsock;
   FD_SET(fd_A[cyc],&rset);
   FD_SET(fd_A[cyc],&wset);
   break;
   }
   }
   printf("the address is%s\n",inet_ntop(AF_INET,
   &cliaddr.sin_addr.s_addr,buf,sizeof(buf)));
printf("And the port is %d\n ",ntohs(cliaddr.sin_port));
if(nsock>maxfd)
{
maxfd=nsock+1;
}
   }
   else
   {
printf("max connections arrived,exit\n");
close(nsock);
break;
   }
}
for(cyc=0;cyc<maxfd;cyc++)
   {
if (FD_ISSET(fd_A[cyc], &wset))//这分支是传送资料
{
SEND_Fun(fd_A[cyc],&wset);
}
   if (FD_ISSET(fd_A[cyc], &rset))//这分支是接受资料
{
ACEPT_Fun(fd_A[cyc],&rset);
}
}
  }
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP