10055 --- 队列已满或者缓冲区空间不足, 以前只所以出现这种问题,就在于收到10060后,继续send。 修改办法就是sleep一段时间或者轮询不断的send.
主要还是connect或者send过于频繁,导致系统资源耗尽。
10048 --- 本地没有可以使用的端口,最大的可能是1-65535大部分端口都处于time_wait状态,该状态出现在ip测试工具测试短连接的时候。
由于tcp默认的四次握手关闭后,主动关闭端(ip + 端口)会进入一个TIME_WAIT状态,
至于Time_wait状态的解释请参见<<UNP卷1>>38页,新版
在windows下默认是30秒,如下中。
10060 --- connect 连接超时,或者send, recv超时。当然后2者是需要设置SO_RCVTIMEO和SO_SNDTIMEO.
这里的connect超时是直接堵塞调用connect, 没有使用select + fd可读或者可写的方式来判断的超时
10054 --- 非常有名的错误,连接被远端服务器重置。
这个问题的关键是看,10054的RST包是由谁发出来的
就目前来说,可能的成因如下:
(1) 被网络设备或者防火墙之类的强制关闭。这个碰到的最多,许多技术支持都发现了该问题
(2) 对端的进程异常退出,出现段错误或者没有关闭连接直接退出
(3) 使用so_linger选项
(4) 目前发现,当windows 下发送数据量非常大时,客户端操作系统也会产生10054的错误给客户端的发送程序,成因
UDP和ICMP包:
IP服务测试中发现,当请求的UDP端口在某个主机上不存在时,会产生大量的icmp包。这是由于当udp包访问一个不存在的端口时,对端内核会自动回复一个icmp错误包。
但是这样的机制对于应用层是没有意义的,因为系统调用比如sendto, 只是把数据写入tcp/ip协议栈,就算调用成功,何时发送都要取决于内核,何况这个异步错误。