我有一个通过Internet套接字(UDP)传输数据的程序。所以定义了char数组作为数据包。例如。 char packet1[] = 11
(标题[2位])+ 192.168.100.158
(sender_IP [15位])+ 006
(TTL [3位数])+ ...(11192.168.100.158006...
)。接收器根据数组的索引提取数据(例如0-1是头,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_IP
地址(inet_aton(sender_IP, &si_other.sin_addr)
。
我很感激所有的建议。提前谢谢。
答案 0 :(得分:1)
将IP发送为32位int,或者用零填充字符串,使其长度合适,例如: 192.168.100.005。
答案 1 :(得分:1)
使用limit-group-char like =“!!!”或“xxx”并检测它以了解从哪里开始检测
答案 2 :(得分:1)
有一种方法可以将它复制到一个本地结构中,该结构还有一个字节可用于额外添加的NUL字节。
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);
更新:这是strncpy()可能有用的极少数地方之一。