【问题标题】:c - multiple variables over udp socketc - udp 套接字上的多个变量
【发布时间】:2014-09-25 20:29:08
【问题描述】:

我必须通过 udp 套接字发送多个变量类型:一个 int 数组和一个 char。我想在同一个 udp 数据包上发送它。什么是标准溶液?将所有内容转换为字节或类似的东西?

我正在使用:sendto(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen);

我的代码是这样的:

int buffer[100];
char flag = '0';
int i = 0;

for (i = 0; i < 50; i++) {
    buffer[i] = i * 2;
}

if (sendto(s, buffer, sizeof(buffer), 0, (struct sockaddr *) &si_client, slen) == -1 ){
    //error
}

//rest of the program

【问题讨论】:

    标签: c sockets


    【解决方案1】:

    是的,您需要将消息序列化为字节数组。没有接受int 数组的sendto 版本。试试这样的:

    int arr[] = {1, 2, 3};
    char str[] = "hello";
    size_t buflen = sizeof arr + sizeof str;
    
    char* buf = malloc(buflen);
    if (NULL == buf)
        abort();
    unsigned i = 0;
    for (unsigned j=0; j<3; ++j)
    {
        buf[i++] = (arr[j] >> 24) & 0x000000ff;
        buf[i++] = (arr[j] >> 16) & 0x000000ff;
        buf[i++] = (arr[j] >>  8) & 0x000000ff;
        buf[i++] = (arr[j] >>  0) & 0x000000ff;
    }
    strcpy(&(buf[i]), str);
    
    if (sendto(s, buffer, sizeof(buffer), 0, (struct sockaddr *) &si_client, slen) == -1 ){
        //error
    }
    

    请注意,您的消息仍可能作为多个数据包发送,例如,如果其大小超过路径 MTU。

    【讨论】:

    • 网络字节顺序是大端的。但你使用什么并不重要,只要接收者知道如何解码它。
    • @nix,谢谢你的回答。我可以请您发布一个代码示例吗?
    【解决方案2】:

    通常的方法是将数据放入结构中。然后,您可以使用“sendto”调用一次发送整个结构。

    请注意,虽然这不是完全可移植的。不同的系统可能会以不同的方式布局您的结构。为了降低发生这种情况的风险,您应该这样做。

    • 布局您的结构,使所有值自然对齐并且您不依赖填充。
    • 在填写结构并解释其内容时,使用“htons”、“htonl”、“ntohs”和“ntohl”宏将主机字节顺序转换为网络字节顺序,反之亦然。

    【讨论】:

      猜你喜欢
      • 2011-07-25
      • 1970-01-01
      • 2016-07-10
      • 1970-01-01
      • 2011-12-05
      • 1970-01-01
      • 2013-11-07
      • 2015-12-14
      • 1970-01-01
      相关资源
      最近更新 更多