0

我有一个通过 Internet 套接字 (UDP) 传输数据的程序。所以定义了 char 数组作为数据包。例如char packet1[] = 11(header[2 digit]) + 192.168.100.158(sender_IP[15 digit]) + 006(TTL [3 digit])+... ( 11192.168.100.158006...)。接收端根据数组的索引提取数据(例如0-1是header,2-16是sender_IP)。

我的问题是,当我将 sender_IP 定义为 [2-16] 并且 IP 地址短于 15 位(例如 192.168.100.5)时,接收方会错误地提取数据。我的问题是,即使 IP 地址是 15 位或 14 位(不添加额外字符来定义 sender_IP 的字符串长度),如何确保正确提取 sender_IP?

我正在考虑创建一个结构类型并定义类似`

struct packet {
   char header[1];
   char senderIP[15]
   , TTL[2];
  };

. 但我无法弄清楚该写什么而不是 buf在这一行上sendto(s, buf, BUFSIZE, 0,(struct sockaddr *) &si_other, slen),因为buf我知道需要是 char 。我需要 ASCII 表示的 IP 地址作为发送一些数据到sender_IPaddress (inet_aton(sender_IP, &si_other.sin_addr)

4

3 回答 3

1

There is a way to copy it to a local struct which has one more byte to make place for an extra added NUL byte.

struct packet *in;
struct cooked_packet {
   char header[1];
   char sender_ip[1+ sizeof in->ip];
   char ttl[2];
   } this;

this.header = in.header;
strncpy(this.ip, in->ip, sizeof in->ip);
this->ip [ sizeof this.ip -1] = 0;
memcpy(this.ttl, ip->ttl, 2);

UPDATE: This is one of these rare places where strncpy() could be useful.

于 2012-05-24T22:02:51.120 回答
1

以 32 位整数形式发送 IP,或将字符串用零打包,使其长度合适,例如 192.168.100.005。

于 2012-05-24T21:52:22.233 回答
1

使用像 = "!!!" 这样的限制组字符 或“xxx”并检测它以知道从哪里开始检测

于 2012-05-24T21:52:38.567 回答