socket网络编程的select控制问题
前提描述:服务器和客服端对发文件,文件大小可能不一样,现在还主要是一对一的。问题:能正确连接,同时可以传送,但是在较小文件的最后一次传完后(这里传送比接收快,发送接受模型看代码最后),
select依然认为FD_ISSET(fd_A, &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!=0)
{
FD_SET(fd_A,&rset);
FD_SET(fd_A,&wset);
if(fd_A>maxfd)
{
maxfd=fd_A;
}
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==0)
{
fd_A=nsock;
FD_SET(fd_A,&rset);
FD_SET(fd_A,&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, &wset))//这分支是传送资料
{
SEND_Fun(fd_A,&wset);
}
if (FD_ISSET(fd_A, &rset))//这分支是接受资料
{
ACEPT_Fun(fd_A,&rset);
}
}
}
}
页:
[1]