13 12
发新话题
打印

调用close方法后,blocking 的 read方法不返回

调用close方法后,blocking 的 read方法不返回

大家好!
; e; x* ~/ \# j: G  ]5 p3 M, g       新手请教个问题:一个TCP的客户端程序,以block的方式使用socket, 起了两个线程分别处理同一个连接的读取和写入,发现当写入线程close() 连接后,读取线程里block在那里的read方法没有反应,用netstat -n查看,发现连接没有释放,依然是ESTABLISHED状态,请问各位大侠,如果用block的方式,有什么方法唤醒read?

TOP

这跟唤醒没关系。。。。。。阻塞方式没有超时机制,除非退出否则不会释放的。
上帝说,有问题,找GOOGLE 写程序是很神圣的事情!同样只是装系统,卖菜的大娘会的事情不见得就跟卖菜一样了。

TOP

跟唤醒没有关系还可以接受,但read在blocking时,对close方法不响应,个人觉得实现的有点问题,也就是说read blocking时,内核不对read做任何处理同时也不释放资源,这样的实现方式对于网络程序编程,虽然可以通过变通的方式完成应用程序要求,但比较别扭!

TOP

不知道你说的对close方法不响应是指什么?一端read一端close?这种情况怎么会不响应呢?肯定会有错误返回啊。
上帝说,有问题,找GOOGLE 写程序是很神圣的事情!同样只是装系统,卖菜的大娘会的事情不见得就跟卖菜一样了。

TOP

我指的是自己这一端的close,不是另一端的close,有两个线程,一个线程管发,一个线程读取,发的线程close连接后,读的线程由于正好read blocking,没有任何反应,此时发现连接不释放。

TOP

确实是这样的,所以在写之前要判断socket是否准备好可写,然后再写。。。。。而当前在阻塞读的时候是不可能close的,而且多进程共享同个socket,只有所有进程都close,才会释放。
上帝说,有问题,找GOOGLE 写程序是很神圣的事情!同样只是装系统,卖菜的大娘会的事情不见得就跟卖菜一样了。

TOP

谢谢版主的验证,那我也就不再在这个问题上花时间了;其实判断socket是否准备好是没有用的,如:在read刚开始时,socket是正常的,但之后对方的机器突然down了(这个时候,客户端是收不到socket异常的;对方close了连接是可以收到socket异常的),发送的线程通过发送心跳报可以检测到出了问题,但这个时候,read 线程程序正在blocking,这个线程也就废了!我觉得是否可以这样断言:在当前的linux系统的read bloking机制下,程序员在编程时,不要使用没有超时设置的read blocking方式读取数据,不然就会有资源泄漏发生!

TOP

发现楼主是游客身份,请问楼主是如何作到的?

TOP

[QUOTE=mislang]谢谢版主的验证,那我也就不再在这个问题上花时间了;其实判断socket是否准备好是没有用的,如:在read刚开始时,socket是正常的,但之后对方的机器突然down了(这个时候,客户端是收不到socket异常的;对方close了连接是可以收到socket异常的),发送的线程通过发送心跳报可以检测到出了问题,但这个时候,read 线程程序正在blocking,这个线程也就废了!我觉得是否可以这样断言:在当前的linux系统的read bloking机制下,程序员在编程时,不要使用没有超时设置的read blocking方式读取数据,不然就会有资源泄漏发生![/QUOTE]
" r" h4 h" R6 F6 c# ]) c& }呵呵,泄漏?程序退出的话就不存在了。
上帝说,有问题,找GOOGLE 写程序是很神圣的事情!同样只是装系统,卖菜的大娘会的事情不见得就跟卖菜一样了。

TOP

呵呵,不是我克意要做“游客”身份,注册的时候网站报错了,不过这个游客的身份也不错的。" _) V+ P, ]5 W: K3 e: _8 w; g9 A9 `
; J. m% j' Y1 _* j9 E( B6 R  ^6 C1 i
程序是一般不退出的,是后台长时间运行的程序,我觉得编程时也不应该将释放资源都交给退出程序吧,^_^

TOP

 13 12
发新话题