首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >发送()函数在C中如何处理如果不是所有的字节都被发送了?

发送()函数在C中如何处理如果不是所有的字节都被发送了?
EN

Stack Overflow用户
提问于 2013-01-07 00:32:07
回答 3查看 19K关注 0票数 9

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

根据send()函数docs,它说,

代码语言:javascript
复制
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,

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

我只想知道这是不是真的?或者有没有更聪明的方法,这样所有请求的数据都会被发送,而我不必担心什么时候不是所有数据都被发送了?

谢谢,

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-01-07 00:36:29

是的,您必须前进缓冲区指针并重复send调用,直到整个缓冲区被耗尽或者您得到一个硬错误。标准的成语看起来像这样:

代码语言:javascript
复制
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),则不能使用此技术;您必须将短发送视为失败。

票数 11
EN

Stack Overflow用户

发布于 2013-01-07 00:36:44

您可以尝试如下所示:

代码语言:javascript
复制
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;
}
票数 6
EN

Stack Overflow用户

发布于 2013-01-07 00:34:17

是的,您确实需要担心send (或write等)返回的值。没有非常聪明的方法可以绕过它,但有一些由优秀的Richard Stevens编写的函数,即readnwriten

This article on informit似乎有这些函数的一个版本。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14184181

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档