2012-11-29 60 views
4

我試圖構建將通過UDP發送的數據包。但是,我沒有在接收方獲得正確的數據。C++ - 構建有報頭的分組發送它通過一個UDP套接字

在欲包括IP報頭,UDP報頭,並需要被髮送的數據分組。在這種情況下,我只想發送「Hello」一詞和隨機標題信息。

char *data = "Hello"; 
char *packet = (char *)malloc(sizeof(struct iphdr) + sizeof(struct udphdr) + strlen(data)); 
struct iphdr *ip = (struct iphdr*) packet; 
struct udphdr *udp = (struct udphdr*) (packet + sizeof(struct iphdr)); 
char *send_buff = (char *) (packet + sizeof(struct iphdr) + sizeof(struct udphdr)); 
ip->saddr = inet_addr("1.2.3.4"); 
ip->daddr = inet_addr("5.6.7.8"); 
ip->ttl = 5; 
udp->source = 5950; 
udp->dest = 5950; 
udp->len = sizeof(struct udphdr); 
udp->check = 0; 
strcpy(send_buff, data); 

sendto(sock, packet, (sizeof(struct iphdr) + sizeof(struct udphdr) + strlen(data)), ROUTER_IP); 

我遇到的問題是,接收端只是得到隨機數據,所以我假設字節數不正確的地方。

在接收端,我把它打印出來的IP報頭作爲測試的領域之一,但它是不正確的。

char recv_buff[1000]; 
int recv_bytes = recvfrom(sock, recv_buff, sizeof(recv_buff)); 
struct iphdr *ip = (struct iphdr*) recv_buff; 
cout << static_cast<int16_t>(ip->ttl) << endl; 

我把包放在一起是錯誤的還是在接收端有問題? 我使用這個例子http://www.winlab.rutgers.edu/~zhibinwu/html/c_prog.htm作爲參考將數據包放在一起。

+0

可以顯示創建套接字的代碼,以便我可以使用哪種類型的套接字? – akp

+0

int sock = socket(AF_INET,SOCK_DGRAM,0); – Takkun

回答

2

您所創建的套接字socket(AF_INET, SOCK_DGRAM, 0);這意味着它是一個數據報(= UDP,通常情況下)插座,所以網絡協議棧自動包括IP報頭& UDP報頭,等

不過既然你要創建你自己的IP和UDP頭文件,你必須創建一個原始套接字,然後發送數據包(並且還可以根據你的參考代碼計算校驗和)。

要創建一個原始套接字,使用socket(AF_INET, SOCK_RAW, 0)

+0

對不起,我正在尋找添加一個額外的IP和UDP頭在UDP插座自動添加的任何之上。 – Takkun

1

除了與不使用原始套接字的問題,你也不要設置如端口號碼正確。必須採用網絡字節順序,所以你應該使用例如htons。還有其他字段應該是網絡字節順序。

0

如果你正在使用你自己的ip和udp標頭堆棧的頂部我希望你在刪除你的標頭和棧之後解析數據。如果接收套接字是RAW,您也將獲得堆棧的ip和udp頭文件。