我正在通过TCP/IP套接字读取数据流.流负载非常不均匀.有时大量的数据每秒都会到达,有时一小时内没有数据.在长时间不活动期间(没有来自远程服务器的数据,但连接仍在线),我的程序应采取一些措施.
我正在使用select()实现超时.它告诉我是否有数据准备就绪,但我不知道究竟能读多少而不会导致read()阻塞.阻塞是不可接受的,因为它可能比我需要的超时时间长得多.
为了提高效率,将流读入大缓冲区,并使用该缓冲区大小提供read()调用.
如果要填充的缓冲区大于套接字中现有的可用数据量,那么read()会在select()之后阻塞吗?
我有一个网络客户端,它被困在recvfrom不受我控制的服务器中,24 小时以上后,该服务器可能永远不会响应。该程序已经处理了大量的数据,所以我不想杀死它;我希望它放弃当前的连接并继续。(如果返回 EOF 或 -1,它将正确执行此操作recvfrom。)我已经尝试了几种不同的程序,这些程序声称能够通过伪造 RST ( tcpkill、cutter、killcx) 来断开陈旧的 TCP 通道;没有任何效果,程序仍然停留在recvfrom. 我也尝试过关闭网络接口;再次,没有效果。
在我看来,确实应该有一种方法可以在套接字 API 级别强制断开连接,而无需伪造网络数据包。我不介意可怕的黑客攻击,包括手动刺探内核数据结构;这是灾难恢复的情况。有什么建议么?
(为清楚起见,根据 ,此处涉及的 TCP 通道处于 ESTABLISHED 状态lsof。)