使用UDP发送后,unsigned int显示为随机负整数

时间:2012-03-29 23:35:09

标签: c sockets network-programming udp

我将一个带有一个字段(unsigned int)的结构发送到网络模拟器,它输出unsigned int但它不正确。

如果我不重新运行网络模拟器,如果我重新发送具有相同数字的结构,它将是相同的随机整数。如果我发送该数字+1,我得到随机整数-1。

如果我重新运行网络模拟器并重新发送具有相同编号的结构,则会显示不同的随机整数。

这是结果:

struct pkt_INIT {
  unsigned int router_id;
};

这是发送该结构的代码:

  int sock;
  struct sockaddr_in server_addr;
  struct hostent *host;
  char send_data[1024];

  host= (struct hostent *) gethostbyname(emulator_host);

  if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) == -1)
  {
    perror("socket");
    exit(1);
  }

  server_addr.sin_family = AF_INET;
  server_addr.sin_port = htons(emulator_port);
  server_addr.sin_addr = *((struct in_addr *)host->h_addr);
  bzero(&(server_addr.sin_zero),8);

  struct pkt_INIT init;
  init.router_id = router_id;
  strcpy(send_data,(char *)&init);

  sendto(sock, send_data, strlen(send_data), 0,
         (struct sockaddr *)&server_addr, sizeof(struct sockaddr));

我没有网络模拟器的任何代码。

2 个答案:

答案 0 :(得分:1)

您正在使用:strcpy(send_data,(char *)&init);

真的你打算做什么?您正在将struct变量复制到chars数组。假设您只想逐字节复制这种方式,仍然存在问题。 init 不会有NULL终止。因此,对strlen()的后续调用是可疑的。

<强>更新

只需在char数组中存储-1,并在接收方将其转换为整数。

send_data[0]=255; //To store -1
send_data[1]='\0'; 

接收方:

int i;
i = recv_data[0];

'我'将有-1。

答案 1 :(得分:1)

不要使用strcpy()将二进制结构放入二进制数组中。同样,不要使用strlen()来获取结构的长度。这两个函数都是为字符串设计的,并且会复制/读取字节,直到它们遇到空字节。请改用memcpy()sizeof()

memcpy(send_data, &init, sizeof(init)); 
sendto(sock, send_data, sizeof(init), 0, (struct sockaddr *)&server_addr, sizeof(struct sockaddr)); 

在这种情况下,只需删除数组并将结构直接传递给sendto()

sendto(sock, (char*)&init, sizeof(init), 0, (struct sockaddr *)&server_addr, sizeof(struct sockaddr)); 

现在,说到这里,router_id存在问题。大多数网络协议都需要网络字节排序,因此您可能需要或不需要使用htonl(),具体取决于模拟器实际期望的内容:

init.router_id = htonl(router_id);