首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 操作系统 > UNIXLINUX >

alarm中封锁了socketfd,但是recvfrom无法知道

2013-01-21 
alarm中关闭了socketfd,但是recvfrom无法知道while(recvPack MAX_NO_PACKETS){alarm(MAX_WAIT_TIME)if(

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就好了

每次循环开始前判断挺好

热点排行