Chinaunix

标题: linux下的socket编程怎么关闭不了tcp连接??? [打印本页]

作者: mzpyykk    时间: 2009-04-11 00:02
标题: linux下的socket编程怎么关闭不了tcp连接???
ubuntu 8.10下用C写的socket服务器程序,调用close关闭和客户端的连接,close返回是0,但是tcpdump发现双方都没发fin包,在服务器和客户机上netstat也发现tcp连接一直是established状态,最终只能关掉服务器程序才行……没有专门的客户端程序,服务器程序是处理HTTP的东西,所以客户端直接是IE~~

高手帮下忙~~~
作者: rhlei    时间: 2009-04-11 08:22
标题: 回复 #1 mzpyykk 的帖子
RETURN VALUE
       close() returns zero on success.  On error, -1 is returned, and errno is set appropriately.


0代表关闭正常。
作者: mzpyykk    时间: 2009-04-11 09:24
可是双方都不发fin包,tcp连接也一直还是established。这个socket文件描述符我是用fcntl设置了非阻塞的




难道发错版了……
作者: platinum    时间: 2009-04-11 09:40
我记得我回答过这个问题,可能是你重复发的太多自己也不记得了
作者: mzpyykk    时间: 2009-04-11 09:55
呃~~之前我来问过两个iptables的问题~~~这个没来这里问过……
作者: platinum    时间: 2009-04-11 11:13
试试阻塞状态下呢?
另外,能不能把关闭 socket 的代码上下文一起贴出来看一下?
第三个问题,tcpdump 的时候是在两边抓的包还是一边?最好分别在两边抓包

我觉得可能性有几种
1、socket 关闭的方式不对(或者和打开的方式不对有关)
2、非阻塞处理不正确,fcntl 这里的问题,言外之意没阻塞,但也没执行
作者: mzpyykk    时间: 2009-04-11 12:22
原帖由 platinum 于 2009-4-11 11:13 发表
试试阻塞状态下呢?
另外,能不能把关闭 socket 的代码上下文一起贴出来看一下?
第三个问题,tcpdump 的时候是在两边抓的包还是一边?最好分别在两边抓包

我觉得可能性有几种
1、socket 关闭的方式不对( ...


代码写的有点长,就不贴了

1、socket的打开就是int conn_fd=accept(listening_fd,...)这样来的,然后就是fork()一个子进程处理发送和接收,关闭socket就是在该子进程结束的时候close(conn_fd)
2、设置非阻塞我有判断过fcntl的返回值,没发现异常,也确实conn_fd调用recv的时候如果没数据是马上返回-1并把errno置为EAGAIN



自己也在继续试。。。。。。下次有这类问题还是发编程版去吧~~~
作者: platinum    时间: 2009-04-11 13:05
那我还是给你转过去吧
作者: mzpyykk    时间: 2009-04-12 21:07
神奇了,用shutdown(conn_fd,2)居然就可以???有些地方不是说这个跟close没区别了么???




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2