2012-05-24 130 views
0

我有一个通过Internet套接字(UDP)传输数据的程序。所以将char数组定义为数据包。例如。 (发送者IP [15位])+ 006(TTL [3位])+ ...(11192.168.100.158006...)。接收器根据阵列的索引提取数据(例如,0-1是标题,2-16是sender_IP)。通过套接字传输数据C

我的问题是,当我将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)

我将不胜感激所有建议。先谢谢你。

+1

1)用空格填充它。 2)终止它? – wildplasser

+1

顺便说一下,buf不一定是char *,它可能是一个指向struct或任何其他类型的指针,但由于平台和编译器之间的差异以及封装和字节顺序,您几乎不希望直接在套接字上发送结构。 –

回答

1

将IP地址发送为32位整数,或将字符串打包为零,以使其长度适当,例如, 192.168.100.005。

+0

还有网络字节顺序的问题。 ascii避免了这一点。 – wildplasser

+0

是的。如果您打算通过套接字发送整数,您将希望使用htonl()和ntohl()。 –

1

使用limit-group-char like =“!!!”或“xxx”并检测它以知道从何处开始检测

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()可能有用的这些罕见的地方之一。