当前位置: 首页 > 知识库问答 >
问题:

c-udp套接字上的多变量

邓才
2023-03-14

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

我使用的是:sendto(int-sockfd,const-void*buf,size\t len,int-flags,const-struct-sockaddr*dest\u-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个答案

卞俊哲
2023-03-14

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

请注意,虽然这不是完全便携式的。不同的系统可能会布局不同的结构。为了降低这种情况发生的风险,你应该。

  • 布局结构,使所有值自然对齐,并且不依赖填充
孙经艺
2023-03-14

是的,您需要将消息序列化为字节数组。没有接受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。

 类似资料:
  • 我想在服务器端和客户端使用多播套接字。服务器将发送数据,客户端将接收数据。同时,如果数据丢失,客户端将向服务器发送nack数据包,服务器将收到nack数据包。我应该如何实现这一点,一个多播组和一个套接字端口,两个多播组和两个套接字端口?我希望服务器可以同时发送数据和接收nack,这可能吗? 非常感谢。

  • 问题内容: (英语不是我的母语,不用担心某些句子是否很奇怪;)。 我正在开发 PONG游戏, 并且通过创建一些类来帮助我管理窗口,事件…和 网络, 因为我在游戏中添加了 LAN功能 ,但是当前您必须输入您想与之联系的人的地址。一起玩。解决此问题的方法是 广播(扫描播放器的LAN) 。对于ipv4来说这很容易,只需使用地址255.255.255.255,但是我们在2017年就提供了仅适用于ipv4的

  • 这是我的客户端和服务器的代码。 class Client1{Client1(int no){try{String message;message=“Hello this is client”+no;byte[]b=message.getBytes();DatagramPacket dp=new DatagramPacket(b,b length,inetAddress.getLocalHost()

  • 我写了一个简单的udp服务器客户端应用程序与多播套接字。服务器每6毫秒向三个客户端发送数据包。数据包大小为1200字节。这是每秒166,66个数据包。每当其中一个客户端检测到丢失的数据包时,它将通过单播向服务器发送NACK数据包。 第一个测试:服务器和三个客户端通过以太网连接到路由器TP链路TL-WDR4300(dd wrt),一切正常。 第二次测试:只有服务器通过以太网连接到路由器,其他客户端通

  • 我已经在Minikube上部署了一个UDP套接字服务器。套接字服务绑定到端口2152。下面是description pod命令中的IP片段。 我的客户机与minikube运行在同一个VM上,无法与服务器通信。我在客户端使用服务器地址IP 172.17.0.3,端口为2152。我还尝试使用minikube IP 192.168.49.2将UDP数据从客户端发送到服务器。 请帮忙,这里有什么问题。

  • 根据手册页: send()和write(2)之间的唯一区别是标志的存在。使用零标志参数,send()等同于write(2)。另外,下面的调用send(sockfd,buf,len,flags);相当于sendto(sockfd,buf,len,flags,NULL,0); 所以: 这是否意味着在UDP套接字上使用完全可以(如果我不需要)? 是否有方法在UDP套接字上使用(就像现在我在的参数中设置目