【问题标题】:How to send integer array over udp socket in C?如何在 C 中通过 udp 套接字发送整数数组?
【发布时间】:2025-12-29 09:05:06
【问题描述】:

我必须通过 udp 套接字发送一个 int 数组。我是否必须将其转换为 char 数组或字节序列?标准溶液是什么?

【问题讨论】:

标签: c arrays sockets int


【解决方案1】:

你可以这样做:

int array[100] ;
sendto(sockfd, array, sizeof(array), 0, &addr, addrlen);

在另一端接收你的数组(假设你总是发送相同大小的数组):

int array[100] ;
recvfrom(sockfd, array, sizeof(array), 0, &addr, &addrlen);

正如 cmets 中所说,您必须小心发送/接收数据包的系统架构。如果您正在为“标准”计算机开发应用程序,那么您应该没有任何问题,如果您想确定的话:

  • 使用固定大小的类型(包括 stdint.h 并使用 int32_t 或任何您需要的类型。
  • 检查代码中的字节序。

字节序转换:

// SENDER   

int32_t array[100] = ... ;
int32_t arrayToSend[100] ;
for (int i = 0 ; i < 100 ; ++i) {
    arrayToSend[i] = htonl(array[i]) ;
}
sendto(sockfd, arrayToSend, sizeof(arrayToSend), 0, &addr, addrlen);

// RECEIVER

int32_t array[100] ;
int32_t arrayReceived[100] ;
recvfrom(sockfd, arrayReceived, sizeof(arrayReceived), 0, &addr, &addrlen);
for (int i = 0 ; i < 100 ; ++i) {
    array[i] = ntohl(arrayReceived[i]) ;
}

【讨论】:

  • 如何在客户端处理数据包?如果我使用 int 数组,它就不起作用!
  • 一般你不会。如果您发现自己将您的数据包分解,这通常意味着 UDP 不是适合您的协议。
  • 好吧,如果我发送一些东西,我通常也想收到它。 UDP是正确的协议,我只需要知道如何接收一个int数组!
  • 您对协议有足够的了解以决定哪个协议适合您的应用程序,但还不足以发送大量数据?好吧,也许,我有什么资格怀疑...您发送数组的一部分,注意不要跨越int 边界。然后是下一部分。然后下一部分......每个数据包 512 字节的有效负载大小被认为可以在 Internet 上可靠地工作。如果您在内部网络上,则可以使用更大的尺寸,例如 8192。
  • 我知道 UDP 和 TCP 是如何工作的,连接设置太昂贵了,我可以容忍数据丢失并且我发送的字节数少于 512。我知道它是如何工作的,我不知道它的编码标准是什么。
【解决方案2】:

您不必转换它。

例如,你可以这样做:

int array[42];

write(sock, array, sizeof(array));

【讨论】: