我目前在C客户端程序中使用此功能。一切似乎都运行良好,但当关闭此客户端连接的服务器时,write_all()
返回4(即len
)而不是预期的-1。
int write_all(int sock, const void *buf, size_t len)
{
int buf_size = len;
while(len > 0)
{
int result = write(sock, buf, len);
if(result < 0)
{
if(errno == EINTR)
continue;
return result;
}
buf += result;
len -= result;
}
return buf_size;
}
这个功能有什么我缺少的吗?是否有任何其他功能我可以预先调用以确保服务器仍在运行?
由于
答案 0 :(得分:1)
你说“关闭”,你的意思是关闭电源,没有优雅的TCP关闭吗?
在这种情况下,写入调用会成功返回。数据在TCP发送缓冲区中,TCP堆栈尚不知道对等体已关闭。在以后的通话中,程序将收到EPIPE或其他错误。
在确定连接失败之前,TCP堆栈将尝试重传一段时间。答案 1 :(得分:0)
对我来说,这似乎是你无法实现某种握手。
好像你的发送者知道它发送的数据已被完全接收(我认为是这种情况)是不够的,但是它还需要知道接收者是否对它进行了任何处理,你期望套接字的机制比他们提供的更多......
插座只是发射器。
答案 2 :(得分:0)
注意:我在这里假设TCP。
从返回值中,我收集到客户端在获知服务器关闭或以其他方式消失之前设法将4个字节写入发送缓冲区。如果它在没有正确关闭的情况下消失,唯一的方法就是超时发送。之后的下一个write
,shutdown
或close
将收到错误。
如果要在不必经常发送数据的情况下获得消失的端点的快速通知,可以激活套接字keepalive选项。在Linux中,setsockopt(..., SOL_SOCKET, SO_KEEPALIVE, ...)
和TCP_KEEPIDLE
,TCP_KEEPINTVL
,TCP_KEEPCNT
位于SOL_TCP
级。