c - udp socket上的多个变量

时间:2014-08-03 00:19:23

标签: c sockets

我必须在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

2 个答案:

答案 0 :(得分:3)

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

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。

答案 1 :(得分:0)

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

请注意,尽管这并非完全可移植。不同的系统可能会以不同的方式布局您的结构。为了减少发生这种情况的风险,您应该。

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