C中的send()函数如果不是所有字节都被发送怎么处理?

Ahm*_*med 9 c sockets

我需要将数据发送到套接字,基本上传输文件,

根据send()函数文档,它说,

If no error occurs, send returns the total number of bytes sent, which can be less than the number requested to be sent in the len parameter. Otherwise, a value of SOCKET_ERROR is returned,
Run Code Online (Sandbox Code Playgroud)

我担心的是,返回值可能小于请求值.因为我正在读取文件并写入套接字,因为它可能不会发送所有字节,我想如果没有发送完整的缓冲区,我将不得不重试?在这种情况下,我想我不得不以某种方式推进同一个缓冲区上的指针读取字节并再次发送?

我只是想知道这是不是就这样呢?或者有一个非常聪明的方法,以便所有请求的数据发送,而我不必担心什么时候没有发送所有数据?

谢谢,

zwo*_*wol 11

是的,您必须提前缓冲区指针并重复send调用,直到整个缓冲区被消耗或者您遇到硬错误.标准习语看起来像这样:

int
send_all(int socket, const void *buffer, size_t length, int flags)
{
    ssize_t n;
    const char *p = buffer;
    while (length > 0)
    {
        n = send(socket, p, length, flags);
        if (n <= 0)
            return -1;
        p += n;
        length -= n;
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

请注意,如果要发送边界重要的数据报(例如UDP),则无法使用此技术 ; 你必须将短发送作为失败.


iab*_*der 6

你可以尝试类似的东西:

int ret, bytes = 0;
while (bytes < buflen) {
    ret = send(sock_fd, buf+bytes, buflen-bytes, flags);
    //check for errors
    if (ret == -1) {
        // handle error
    }
    bytes+=ret;
}
Run Code Online (Sandbox Code Playgroud)