1. socket.error: [Errno 98] Address already in use
socket 绑定的地址正在使用,常见于非友好关闭套接字。
解决办法:先关闭占用该地址的进程,假设端口号为10000,
$ lsof -i:10000
然后设置allow_reuse_address = True。
2. socket.error: [Errno 104] Connection reset by peer
如果调用 read() 从 TCP 连接上接收数据并返回 -1,且 errno 为 104(Connection reset by peer),这通常表示对端程序没有关闭 socket 就直接退出了 (例如 core dump )。
原因:对端程序没有显式调用 close() 来关闭一个 TCP 连接,那么在进程退出前,操作系统会释放相关的资源,包括关闭打开的文件描述符;但是这种情况下的关闭,只是发送一个 RESET 包就立刻结束,因此 read() 返回 -1 且 errno 为 104。而正常调用 close() 来关闭一个 socket, 会导致关闭连接的两次握手过程,这需要一点网络交互时间;这种情况下, read() 返回的是 0。
因此,在开发过程中,遇到这种现象,可以判断对端程序是不是除了问题。