在C中通过套接字传输数据

时间:2012-05-24 21:48:31

标签: c arrays sockets udp

我有一个通过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)

我很感激所有的建议。提前谢谢。

3 个答案:

答案 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()可能有用的极少数地方之一。