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

recv 阻塞 如何退出

2012-03-27 
recv 阻塞 怎么退出一个客户端阻塞接收服务器端数据,服务器有两台(主,辅),如果主的断了,就连接辅的,如果主

recv 阻塞 怎么退出
一个客户端阻塞接收服务器端数据,服务器有两台(主,辅),如果主的断了,就连接辅的,如果主的启动,就去连接主的,就必须把辅的断掉;我发现,如果自己主动close(socket),如果客户端刚好在接收数据,则一直阻塞在recv,直到服务器发数据过来,才返回-1;

C/C++ code
void *RecvFromAPP(void *arg){    char buf[2048+1]={0};    char temp[2048+1]={0};    int pos=0;    int res=0;    int len=0;    while(1)    {        if(pos<len)        {            memset(temp,0,sizeof(temp));            memcpy(temp,buf+pos,len-pos);            memset(buf,0,sizeof(buf));            memcpy(buf,temp,len-pos);            pos=len-pos;        }        else            pos=0;        res=read_loop(app_arg.appsockfd,buf+pos,2048-pos);        if(res==-1)            break;        else if(res==0)        {            Socket_Delete(app_arg.appsockfd);            break;        }        else if(res>0)        {            len=pos+res;            pos=Packet_DetachFromAPP(buf,len); //这个是分成完整的包,并放到队列中,会用来队列锁        }    }    return NULL;}

我本来想直接把这线程关掉,用phread_cancel,发现这个函数就算调用,线程也不一定会关;后来想用信号让他退出,但是发现他如果在分包,这时候队列的锁就没办法解,我想请问下大家:怎样退出这个了?

[解决办法]
可以试一下shutdown(socket, SHUT_RD),让该套接字关闭读段。
[解决办法]
你这样方法有点儿粗暴.

应该通过控制socket发送切断通知,让客户端自己挂断重新连接。

热点排行
Bad Request.