我必须在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
答案 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”调用一次发送整个结构。
请注意,尽管这并非完全可移植。不同的系统可能会以不同的方式布局您的结构。为了减少发生这种情况的风险,您应该。