尝试解决随机连接被拒绝的错误时,请注意connect_ex通过socket.settimeout设置超时。
最近注意到,在Raspbian OS 9(Stretch)上运行的Python 3.5.3,即在Raspberry Pi上使用TCP套接字的Debian,使用TCP套接字立即多次返回111和103错误序列,然后获得了良好的连接,而最近没有进行任何代码更改。当实际发生连接时,服务器端正在按预期接受连接。看来OS或python3中的一些最近代码更改使连接顺序不太宽容?但是令人沮丧的问题是,我似乎无法更改连接的超时时间,因此应使连接更宽容。
theSocket=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
theTimeOut=socket.getdefaulttimeout()
theSocket.settimeout(5.0)
theResult=theSocket.connect_ex((theHost, thePort))
theSocket.settimeout(theTimeOut)
使用上面的代码进行测试,我得到了两种情况之一...连接几乎立即按预期建立,结果为零。大约有50%的时间会发生这种情况。另一种情况是我反复遇到套接字111和103错误,并且没有连接,这些错误会立即返回,而不是按预期的5秒钟返回。
我通过一个简单的循环来处理连接失败,通常如果我无法立即获得连接,则需要1到7次尝试(等待1秒)才能获得良好的连接。快速连接或慢速连接似乎完全是随机的模式。看着Raspberry Pi处于“顶部”几乎是完全空闲的……没有明显的尖峰或加载问题。
服务器进程上的accept调用嗡嗡作响,完全没有错误或问题,一旦建立连接,我就不会丢失或丢失任何数据。如果您愿意的话,这只是最初的连接请求,我在这里看到这种非常奇怪的行为。
我知道哪些代码可以工作,但是我想避免使用这种蛮力的解决方案。
哦,并且syslog,dmesg等没有明显或明显的迹象表明存在任何问题。加载Raspbian OS的完全干净副本后,会得到相同的行为。没有基于系统配置的防火墙或安全设置。在运行相同版本的OS和Python 3.5.3(最新的完整修补程序)的多个设备上会发生这种情况。