日期:2014-05-16  浏览次数:20733 次

alarm中关闭了socketfd,但是recvfrom无法知道
while(recvPack < MAX_NO_PACKETS)
{
alarm(MAX_WAIT_TIME);    
if( (len = recvfrom(sockfd,recvpacket,sizeof(recvpacket),0,(struct sockaddr *)&from,&fromlen)) <0)
{
if(errno==EINTR)
continue;  
perror("recvfrom error"); 
return NULL;
}

   上面的代码,alarm实现定时,当时间到了还没有收到信息的话就在事先注册好的相应函数中将sockfd关闭掉,但是关闭掉了之后recvfrom函数仍然阻塞,没有返回错误。
    当然可以通过设置nonblock来将sockfd设置,也可以发送pthread_cancel来将该线程取消。但是我想让他知道sockfd已经关闭,并返回错误,然后自然结束。
    另外我已经将sockfd设置为volatile类型,但是仍然不行,忘大家说说思路,怎样让recvfrom知道sockfd已经改变,并自己返回错误。

------解决方案--------------------
可以这样处理:
1. 在信号处理函数里不要关闭sockfd.
2. if(errno==EINTR)说明时间到了,这时不要continue,改为返回超时.
------解决方案--------------------
1、sockfd可以为全局变量,这样在alarm里面关闭后,设为-1.
2、recvfrom之前看看sockfd是否为-1就好了
------解决方案--------------------
引用:
1、sockfd可以为全局变量,这样在alarm里面关闭后,设为-1.
2、recvfrom之前看看sockfd是否为-1就好了

每次循环开始前判断挺好