【问题标题】:Write n bytes and read n bytes: sending number of bytes to read using uint16_t写入 n 字节并读取 n 字节:使用 uint16_t 发送要读取的字节数
【发布时间】:2017-01-15 15:32:06
【问题描述】:

我一直在使用这些readwrite 函数(由@alk 提供)。
问题是我不知道如何正确发送uint16_t data_size;
这是我发送通用示例缓冲区的实际代码:

uint16_t data_size;
int retry_on_interrupt = 0;
char buffer[] = "Hello world!";
data_size = (uint16_t) sizeof(buffer);    

/* sending data_size */
writen(socket, data_size, 2, retry_on_interrupt);

/* sending buffer */
writen(socket, buffer, sizeof(buffer);  

这是我接收通用示例缓冲区的实际代码:

/* receiving data_size */
readn(socket, &data_size, 2);

/* receiving buffer */
readn(socket, buffer, data_size);

但这不起作用,我认为因为writen 需要const char *,而不是我使用uint16_t...
这些电话应该如何?谢谢。

【问题讨论】:

    标签: c sockets tcp stdint


    【解决方案1】:

    替换

    writen(socket, data_size, 2, retry_on_interrupt);
    

    通过

    if (-1 == writen(socket, &data_size, sizeof data_size, 1))
    {
       perror("writen() failed writing size");
       exit(EXIT_FAILURE);
    }
    

    并替换这一行

    writen(socket, buffer, sizeof(buffer);  
    

    通过

    if (-1 == writen(socket, buffer, data_size, 1))
    {
       perror("writen() failed writing pay-load");
       exit(EXIT_FAILURE);
    }
    

    您肯定也想在阅读功能中添加错误检查!


    此外,您还想处理在不同硬件平台之间发送/接收时可能出现的endianness (byte-order) 问题。

    【讨论】:

    • 好的@alk 现在一切都清楚了,一切正常。问题出在 sendfile 调用上。我必须清理offset 并将其重新初始化为0。与这个问题无关,但我还是想告诉你!
    猜你喜欢
    • 2020-06-12
    • 2015-02-17
    • 1970-01-01
    • 2020-03-11
    • 2012-03-10
    • 1970-01-01
    • 1970-01-01
    • 2015-09-01
    • 1970-01-01
    相关资源
    最近更新 更多