我正在使用原始套接字接口(import socket)在Python 2.7.5中编写应用程序.
我需要知道是否有一种方法可以注册某种事件,或者如果TCP套接字连接仍然连接并建立,则可以定期测试.
我发现的大多数建议都说"只是尝试从中读取;如果关闭则会出现错误或没有字节." 但是,有时候我还没有准备好接受read它,但我仍然想知道套接字是否关闭,所以例如我可以立即手动重新连接.
此外,read从套接字中删除从缓冲区读取的字节,因此read简单地测试连接"活性"似乎不可行.
有一个后台线程来检查连接活性就可以了.该线程可以每秒检查一次,看看连接是否有效; 如果它被删除,那么它可以调用一个函数,或设置一个变量或其他东西,以便应用程序知道连接已关闭.知道为什么它关闭(由同行重置,超时等)会更有用......
有什么建议吗?
我使用TCP Keep-Alive选项来检测死连接.它适用于使用读取套接字的连接:
setsockopt(mysock,...) // set various keep alive options
epoll_ctl(ep,mysock,{EPOLLIN|EPOLERR|EPOLLHUP},)
epoll_wait -> (exits after several seconds when remove host disconnects cable)
Run Code Online (Sandbox Code Playgroud)
Epoll等待在套接字上使用EPOLLIN | EPOLLHUP退出而没有问题.
但是,如果我尝试向socket写入很多东西,直到我得到EAGAIN然后轮询读取和写入,我在断开电缆时没有出错:
setsockopt(mysock,...) // set various keep alive options
while(send() != EAGAIN)
;
epoll_ctl(ep,mysock,{EPOLLIN|EPOLLOUT|EPOLERR|EPOLLHUP},)
epoll_wait -> --- Never exits!!!! even when the cable of the remove host is disconnected!!!
Run Code Online (Sandbox Code Playgroud)
编辑:附加信息
当我监控与wireshark的通信时,在第一种情况下(读取)我会在几秒钟内得到一次ack请求.但在第二种情况下,我根本检测不到.