首页 > 技术文章 > socket error汇总

Amagasaki 2014-03-13 10:38 原文

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。

因此,在开发过程中,遇到这种现象,可以判断对端程序是不是除了问题。

推荐阅读