0

インターネットソケット(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];
  };

。しかし、私が知っているようにcharである必要があるので、bufこの行の代わりに何を書くべきかを理解できませんでした 。アドレスにデータを送信するため、ASCII表現のIPアドレスが必要です。sendto(s, buf, BUFSIZE, 0,(struct sockaddr *) &si_other, slen)bufsender_IP(inet_aton(sender_IP, &si_other.sin_addr)

4

3 に答える 3

1

IPを32ビット整数として送信するか、文字列をゼロでパックして、適切な長さになるようにします(例:192.168.100.005)。

于 2012-05-24T21:52:22.233 に答える
1

="!!!"のようなlimit-group-charを使用します または「xxx」で検出し、検出を開始する場所を確認します

于 2012-05-24T21:52:38.567 に答える
1

追加されたNULバイトの場所を作るためにもう1バイトあるローカル構造体にそれをコピーする方法があります。

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()が役立つ可能性があるこれらのまれな場所の1つです。

于 2012-05-24T22:02:51.120 に答える