【问题标题】:does the number returned by send() in C include the null terminator?C 中 send() 返回的数字是否包含空终止符?
【发布时间】:2013-03-27 04:52:03
【问题描述】:

我编写这段代码是为了写入一个套接字(Server 结构包含一个socketfd 字段)

void writeToSocket(Server *server, const char *message) {
    size_t len = strlen(message);
    int bytesWritten = 0;
    while (true) {
        bytesWritten += send(server->socketfd, message + bytesWritten, len, 0);
        if (bytesWritten-len-1 == 0)
            break;
    }
}

这段代码可能有几个问题——我是这方面的新手。随意提出您可能看到的任何危险信号。我主要担心的是循环可能不会终止。

例如:消息为hello(又名hello\0),那么strlen(message) 将为5,但如果@ 987654334@ 包括\0,那么bytesWritten 可能是6。但如果不是,它会是5,在这种情况下if (bytesWritten-len-1 == 0) 是错误的。哪个是正确的?

【问题讨论】:

  • Err... 告诉send你要发送多少字节!
  • 在你的发送大小中包含空终止符,如果 send() 返回你的发送大小你传递了它,那么 yes (就像它之前的字符一样,并且在此之前,等等......)。 (和 +1 克雷克 =P)
  • send发送各种字节,对0字节没有特殊处理。
  • 无论如何我都不会依赖终结者。使用htonl()(32位)或htons()(16位)以网络字节顺序发送一个32位(或16位)长度的前导码,然后发送char数据。至少那时你知道你应该收到多少。当您在另一端收到长度作为第一个字节时,反转字节重新排序调用(分别为ntohl()ntohs()。注意:它们不是标准库(它们是 POSIX-1.2001),因此请相应地设置您的配置.
  • 您的代码还有很多其他问题需要解决。

标签: c sockets send


【解决方案1】:

send(3) 发送给定数量的字节;如果您发送的是字符串、整数数组或随机struct,它不会在意。如果不包括结尾'\0',则不包括在内。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-06
    • 2020-10-06
    • 1970-01-01
    • 2013-10-22
    相关资源
    最近更新 更多