尝试在C中定义write_all()套接字函数时遇到问题

时间:2011-11-23 12:38:27

标签: c sockets unix posix

我目前在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;
}

这个功能有什么我缺少的吗?是否有任何其他功能我可以预先调用以确保服务器仍在运行?

由于

3 个答案:

答案 0 :(得分:1)

你说“关闭”,你的意思是关闭电源,没有优雅的TCP关闭吗?

在这种情况下,写入调用会成功返回。数据在TCP发送缓冲区中,TCP堆栈尚不知道对等体已关闭。在以后的通话中,程序将收到EPIPE或其他错误。

在确定连接失败之前,TCP堆栈将尝试重传一段时间。

答案 1 :(得分:0)

对我来说,这似乎是你无法实现某种握手。

好像你的发送者知道它发送的数据已被完全接收(我认为是这种情况)是不够的,但是它还需要知道接收者是否对它进行了任何处理,你期望套接字的机制比他们提供的更多......

插座只是发射器。

答案 2 :(得分:0)

注意:我在这里假设TCP。

从返回值中,我收集到客户端在获知服务器关闭或以其他方式消失之前设法将4个字节写入发送缓冲区。如果它在没有正确关闭的情况下消失,唯一的方法就是超时发送。之后的下一个writeshutdownclose将收到错误。

如果要在不必经常发送数据的情况下获得消失的端点的快速通知,可以激活套接字keepalive选项。在Linux中,setsockopt(..., SOL_SOCKET, SO_KEEPALIVE, ...)TCP_KEEPIDLETCP_KEEPINTVLTCP_KEEPCNT位于SOL_TCP级。