相关疑难解决方法(0)

Python:检测套接字何时因任何原因断开连接?

我正在使用原始套接字接口(import socket)在Python 2.7.5中编写应用程序.

我需要知道是否有一种方法可以注册某种事件,或者如果TCP套接字连接仍然连接并建立,则可以定期测试.

我发现的大多数建议都说"只是尝试从中读取;如果关闭则会出现错误或没有字节." 但是,有时候我还没有准备好接受read它,但我仍然想知道套接字是否关闭,所以例如我可以立即手动重新连接.

此外,read从套接字中删除从缓冲区读取的字节,因此read简单地测试连接"活性"似乎不可行.

有一个后台线程来检查连接活性就可以了.该线程可以每秒检查一次,看看连接是否有效; 如果它被删除,那么它可以调用一个函数,或设置一个变量或其他东西,以便应用程序知道连接已关闭.知道为什么它关闭(由同行重置,超时等)会更有用......

有什么建议吗?

python sockets

19
推荐指数
1
解决办法
3万
查看次数

在写入被阻止的套接字上使用TCP Keep-Alive获取断开连接通知

我使用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请求.但在第二种情况下,我根本检测不到.

linux epoll tcp keep-alive

4
推荐指数
1
解决办法
1万
查看次数

标签 统计

epoll ×1

keep-alive ×1

linux ×1

python ×1

sockets ×1

tcp ×1