当前位置:  技术问答>linux和unix

socket read阻塞:一个线程关闭另一个线程错误

    来源: 互联网  发布时间:2016-08-30

    本文导语:  本帖最后由 yangzhifu 于 2010-05-27 12:01:31 编辑 机制:两个线程,一个线程通过关闭socket来让另外一个线程退出,具体如下: service线程,负责接受数据,当为-1的时候退出,当接受到心跳包的时候,更新时间,代码如下: ...

本帖最后由 yangzhifu 于 2010-05-27 12:01:31 编辑
机制:两个线程,一个线程通过关闭socket来让另外一个线程退出,具体如下:
service线程,负责接受数据,当为-1的时候退出,当接受到心跳包的时候,更新时间,代码如下:

        time_t activetime;
while(signalquit)
{
memset(curr_pack,0,sizeof(serv_pack));
nrecv = read(my_id,(unsigned char *)curr_pack,16);

if(nrecv == -1 )
{
break;
}
else
{
memcpy(&keep_alive,curr_pack,sizeof(keep_alive)); //心跳包
if (keep_alive == -1 )
{
activetime = time((time_t *)NULL);
continue;
}
                         }
         }
    close_sock(my_id);
    clear_by_sock_id(my_id);
    free(curr_pack);

tiem_active线程,如果超时,那么关闭socket
void	time_activeThrFxn(void )
{
time_t cur_time;
if(DEBUG)
printf("Init active_time thread! n");
while(signalquit)
{
if (cur_time - activetime  > DELAYTIMENUM){
close_sock(my_id);
}
}
sleep(DELAYTIMENUM/12);
}

}


问题:在socket关闭后service线程的read函数一直阻塞,不能退出
为什么socket关闭后read还会一直阻塞呢?怎么没有退出,有什么解决方法?

|
这里应该调用socket的标准接口recv,他会判断socket关闭时并返回-1.

还有一点要注意:就是尽量不考虑外部来关闭线程,所以使用pthread_cancel要谨慎.

|
你可以用        int pthread_cancel(pthread_t thread);
取消掉 目标线程。

|

另外,你可以使用 select 模型类避免阻塞的问题。
nrecv = read(my_id,(unsigned char *)curr_pack,16);

|
貌似标准并没有定义描述符关闭后再 在其上读操作的结果,照理是两种,一种出错返回-1,另一种就是阻塞,因为发来的数据找不到相应的描述符,所以虽然已经关闭描述符,但是仍然可以引用,但是套接字协议认为已经关闭,肯定不会再把数据发到该描述符

    
 
 

您可能感兴趣的文章:

  • 线程间可否通过管道传递SOCKET句柄?还有其他方式传递SOCKET么?
  • 如果两个线程操作同一个Socket,一个线程recv,另一个send。这样会不会导致程序莫名其妙的退出
  • 多线程socket申请有无可能产生冲突?
  • socket 多线程编程
  • 多线程和socket结合
  • 请教:多线程使用同一个socket进行数据收发会出现什么问题?
  • socket实现多文件并发传输,求助多线程实现问题?
  • 请问关于多线程SOCKET的问题
  • 多线程socket程序莫名其妙接收到SIGALRM信号问题。
  • 多线程中socket的问题
  • 请问关于socket客户端因事件启动新线程的问题.高手请进
  • 一个关于socket线程池问题
  • 多线程close() socket套接字的问题
  • socket+多进程+多线程
  • 请问可以在一个Servlet里使用多线程和SOCKET吗?
  • 关于linux下多线程socket通讯的问题
  • Unix domain socket可用于同一个进程中的不同线程么?
  • 多余SOCKET服务器来说,用哪种线程安全锁性能最高?
  • socket通讯时如何为线程池分配Recv任务?
  • 如何在主进程共享子线程中accept得到的socket号?
  • linux 如何用SOCKET设置函数设置阻塞和非阻塞?
  • 非阻塞SOCKET,竟然也会阻塞?
  • 初级问题,socket(AF_INET, SOCK_STREAM, 0)是阻塞式还是非阻塞式?
  • 关于socket编程中阻塞的问题
  • linux C socke编程 创建的socket默认是阻塞的还是非阻塞的?
  • linux socket fd 写阻塞问题
  • socket编程,关于connect阻塞问题
  • 多余SOCKET服务器来说,用哪种线程安全锁性能最高? iis7站长之家
  • 当进程处于socket读阻塞模式中,外部SIGNAL发生,此时信号相应响应函数可否进行socket写?
  • select和非阻塞socket的迷惑
  • linux下socket的send函数阻塞问题?
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 在inter版solaris 8上编socket程序,在read时遇到错误,错误号14,用strerror()看不到错误描述,请解决,多谢!
  • ftp连接出现socket错误=#10054的解决方法
  • Linux 下用什么函数查找socket上一次的错误?
  • socket send()函数错误
  • 连续创建和关闭1024个socket就会出现问题,错误码24,怎么办?
  • socket下调用write后出现:Broken pipe错误
  • 运行sipp 出现 Unable to bind main socket 错误
  • socket创建失败,返回系统错误码84,invalid or incomplete multibyte or wide character
  • VM下的linux Socket程序怎么客户机一连接就出现Bad address的错误?
  • [紧急求助]socket在read时提示Connection reset by peer错误
  • 请问如何捕获linux c SOCKET中SEND的错误,请指教,谢谢!
  • socket连接函数connect()返回错误 errno 为 115,什么原因?谢谢
  • socket错误提示: Transport endpoint is not connected
  • socket中bind时报权限错误
  • 已和客户端连接建立的socket在客户端CTRL-C后怎么在服务器端捕捉这个错误?
  • LINUX SOCKET 错误
  • 在编译有关socket的例子时老有这些错误,是什么一回事
  • (请高手救命啊!在线等)Socket Send的时候,不停的得到EINTR错误返回, 请问是为什么?
  • 200分!!嵌入式Linux下通过TCP访问服务器,Socket被服务器重置,错误号104??(高手请进)解决后加送100分!!!
  • (100)"断开的管道" 在Socket编程当中,如果我连续发送包,例如1000次,总会出现"断开的管道"的错误提示,请问如何解决
  • java命名空间java.net类socket的类成员方法: socket定义及介绍
  • re socket编程中 ACCEPT返回的socket与原socket(他参数中的)端口号一样吗?
  • java命名空间java.nio.channels类socketchannel的类成员方法: socket定义及介绍
  • libevent2需要从socket读一段数据写入一个socket中,同时发送给另一个socket
  • java命名空间java.nio.channels类serversocketchannel的类成员方法: socket定义及介绍
  • socket 通讯开发包 Simple Sockets
  • java命名空间java.nio.channels类datagramchannel的类成员方法: socket定义及介绍
  • C++ Socket 库 C++ Sockets
  • java命名空间java.net类socket的类成员方法: getsendbuffersize定义及介绍
  • vc做的的socket应用和unix下socket?
  • java命名空间java.net类socket的类成员方法: getreceivebuffersize定义及介绍


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3