当前位置: 首页 > 知识库问答 >
问题:

为什么send函数在socket中返回0,而客户端却收到了消息?

夏何平
2023-03-14
void SendStr(int connfd, std::string str)
{
    uint16_t *len = new uint16_t(str.size());
    const char * lenByte = (char *)len;
    char *sendByte = new char[*len + 2]{0};
    memcpy(sendByte,lenByte,sizeof(*len));
    memcpy(sendByte + 2, str.c_str(), *len);
    std::cout << "str size " << *len << std::endl;
    //std::cout << "len size " << sizeof(len) << std::endl;

    size_t nleft = *len + 2;
    std::cout << "need to send " << nleft << std::endl;
    int nsend = 0;
    while (nleft > 0)
    {
        //std::cout << "sending " << nleft << "bytes" << std::endl;
        if (nsend = (write(connfd, sendByte + nsend, nleft)) < 0)
        {
            if (errno == EINTR)
                continue;
            ERROR_EXIT("send");
        }
        else if (nsend == 0)
            //continue;
            break;
        nleft -= nsend;
        std::cout << "sended " << nsend << " left " << nleft << std::endl;
    }
    std::cout << "send complete" << std::endl;
    delete[] sendByte;
    delete len;
}

这里是完整的代码
我看到write和send函数返回字节数的和,而这里返回0,并且客户端似乎运行正常,这让我很困惑。

共有1个答案

乜业
2023-03-14

你看到的不对。

在这份声明中

        if (nsend = (write(connfd, sendByte + nsend, nleft)) < 0)

(write(connfd,sendByte+nsend,nleft))<0的比较结果与nsend进行比较。如果条件为true,则该值将变为1,如果条件为false,则该值将变为0。看来你误解了这个比较结果是字节的总和。

如果要将从write返回的内容分配给nsend然后进行比较,则应该是这样的:

        if ((nsend = write(connfd, sendByte + nsend, nleft)) < 0)

补遗:write在套接字上返回0的唯一方法是,如果nleft为0。

 类似资料:
  • 当某个对象具有装箱类型属性时,该属性的getter返回。但是这应该返回,因为boxed type属性的默认值是。这里有什么问题?

  • 问题内容: 在Python 2.6中查看Queue.py时,我发现这个结构有点奇怪: 如果maxsize为0,则队列永远不会满。 我的问题是在这种情况下如何运作?如何0 < 0 == 0被认为是错误的? 问题答案: 我相信Python对关系运算符的序列有特殊的处理方式,以使范围比较易于表达。能说比说好得多。 这些称为链接比较。这是他们文档的链接。 在您谈论的其他情况下,括号会强制在一个关系运算符之

  • 我知道(-0==0)是真的。我很想知道为什么-0 当我在stackoverflow执行上下文中运行这段代码时,它返回。 但是当我在浏览器控制台中运行相同的代码时,它返回。那是为什么呢?我试图在谷歌上搜索它,但没有找到任何有用的东西。这个问题可能不会给某个人的实际例子增加价值,我想了解JS是如何计算它的。

  • 问题内容: 我有这样的事情: 而且我总是得到“时钟周期为:0-0”的输出 知道为什么会这样吗? (仅给出一点点细节,something_else()函数使用蒙哥马利表示法执行从左到右的求幂运算,而且我不确定不确定something_else()函数确实花费了一些不可忽略的时间。) 这是在Linux上。uname -a的结果是: 问题答案: 该功能不测量CPU时钟周期。 C说: “ 从实现定义的仅与

  • 问题内容: 为什么以下返回0? 问题答案: 月份从0(一月)到11(十二月)进行编号。 参考:

  • 1.场景描述:设备向Netty服务器发送数据(大约##20ms间隔##),Netty服务器向客户端转发消息##立即##(IOS或Android)。2.关联业务代码CTX.WriteAndFlush(msg) 3.发出网络服务器可以及时接收设备数据,网络服务器也可以及时将数据写入套接字缓冲区。但Netty客户端收到消息时延!!!(如5s时延) 4.服务器带宽配置入站100M/bps位/秒。出站5M/