C 如何在write()超时时破坏性地关闭套接字?

C 如何在write()超时时破坏性地关闭套接字?,c,linux,sockets,C,Linux,Sockets,不知道我的标题写得有多好。我已经编写了一个linux域套接字服务器和客户端。客户端在写入时设置超时值。如果客户端无法发送其所有数据,我不希望服务器接受其发送的数据。客户机有没有办法表明它没有发送所有数据?可能会导致服务器的read()失败?这些套接字被设置为流套接字 所以基本上我想知道在这种情况下该怎么办: ssize_t bytes_written = write(fd, buffer, length); if (bytes_written == -1) { result =

不知道我的标题写得有多好。我已经编写了一个linux域套接字服务器和客户端。客户端在写入时设置超时值。如果客户端无法发送其所有数据,我不希望服务器接受其发送的数据。客户机有没有办法表明它没有发送所有数据?可能会导致服务器的read()失败?这些套接字被设置为流套接字

所以基本上我想知道在这种情况下该怎么办:

ssize_t bytes_written = write(fd, buffer, length);
if (bytes_written == -1)
    {
    result = -1;
    goto done;
    }

// I think the only case where we can have write return                     
// a successful code but not all bytes written is when the                  
// timeout value has elapsed and some number of bytes have                  
// been written.                                                            

if (bytes_written != length)
    {
    result = -1;
    errno = ETIMEDOUT;
    }
.
.
.

done:
    if (result == -1)
        result = errno;
    if (fd != -1)
        {
        shutdown(fd, SHUT_RDWR);
        close(fd);
        }
    return result;
}

我意识到一个显而易见的解决方案是客户端先发送字节计数,然后再发送字节。我在想是否还有别的办法。此外,每条消息的大小也可能不同。

您可以在头部使用一定长度的数据包。如果数据与长度不匹配,服务器可以删除数据。

您可以在头部使用长度对数据进行分组。如果数据与长度不匹配,服务器可以删除数据。

我标记为答案,因为似乎没有其他方法,至少对于基于流的套接字。我标记为答案,因为似乎没有其他方法,至少对于基于流的套接字。