2012-05-24 267 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()可能有用的這些罕見的地方之一。