c - C中的send()函数如果没有发送所有字节如何处理?

标签 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,

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

我只想知道是不是这样?还是有更聪明的方法,以便发送所有请求的数据,而不必担心何时未发送所有数据?

谢谢,

最佳答案

是的,您必须推进缓冲区指针并重复 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;
}

请注意,如果您要发送边界重要的数据报(例如 UDP),您不能使用此技术;您必须将短发送视为失败。

关于c - C中的send()函数如果没有发送所有字节如何处理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14184181/

相关文章:

c++ - 访问结构体或字节中的位子集更快吗?

c# - 将代码片段从 C 转换为 C#

objective-c - 如何为 iOS 5 编译 Rabbitmq-c 库?

c - 为什么 PSTR 类型在不同的 visual studio 项目类型上有不同的行为?

c# - 为什么SocketAsyncEventArgs.RemoteEndpoint返回null? C#

C 编程 - 意外的输出

java - 如何通过 NetManager 类使用 Telnet 设置服务器-客户端通信

c# - 在 C# 应用程序之间流式传输数据

java - 使用套接字手动发送 Keep-Alive 数据包

c++ - QTcp 服务器 : bind socket with custom options