[转]socket 编程中出现的两个情况及原因分析

感谢原文地址:http://blog.csdn.net/rstevens/archive/2008/11/12/3284661.aspx

1. Connection reset by peer

如果调用 read() 从 TCP 连接上接收数据并返回 -1,且 errno 为 104(Connection reset by peer);这通常表示对端程序没有关闭 socket 就直接退出了 (例如 core dump );
正常调用 close() 来关闭一个 socket, 会导致关闭连接的两次握手过程,这需要一点网络交互时间;这种情况下, read() 返回的是 0。

 

如果对端程序没有显式调用 close() 来关闭一个 TCP 连接,那么在进程退出前,操作系统会释放相关的资源,包括关闭打开的文件描述符;但是这种情况下的关闭,只是发送一个 RESET 包就立刻结束,因此 read() 返回 -1 且 errno 为 104。

 

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

 

 

2. write() 调用返回 -1 且 errno 为 EAGAIN

当在一个非阻塞的 socket 上调用 write(),可能会出现上述现象。

在非阻塞的 socket 上, write() 操作仅仅把数据送入内核空间的 buffer 就立刻返回;如果 socket 在内核空间中对应的 buffer 已满,就会出现这种现象。

 

有两种处理方式:

第一种比较简单,就是在稍后重新发送数据

第二种是通过 selecet(), poll() 等系统调用,在得到 socket 可写的通知时,再去发送数据

One thought on “[转]socket 编程中出现的两个情况及原因分析

Leave a Reply

Your email address will not be published.