2013-10-24 268 views
0

當我recvfrom(),收到的消息是正確的,但源地址是一團糟, 爲什麼會發生這種情況?recvfrom()得到錯誤的源地址

char traid_messageR[MAXDATASIZE]; 
socklen_t addlen; 
struct sockaddr_in source_addr; 
if((numbytes=recvfrom(udp_sockfd, traid_messageR, 256, 0, (struct sockaddr*)&source_addr, &addlen)) == -1) 
{ 
    perror("recvfrom"); 
    exit(1); 
} 

的結果是這樣的:

(gdb) print source_addr 
$1 = {sin_family = 61428, sin_port = 42, sin_addr = {s_addr = 49809}, 
    sin_zero = "\234\352\377\277\310\352\377\277"} 

的49809看起來像一個端口號,但正是這種接收器的端口號......沒有任何一個有想法,爲什麼是這樣的感謝?很多 哦,另一件事,我用select()循環,IF_ISSET(und_socked,%fds),然後優於上面的代碼,這會影響?

回答

2

你沒有值分配給addlen

addlen = sizeof(source_addr) 

UPDATE:指http://pubs.opengroup.org/onlinepubs/7908799/xns/recvfrom.html 手冊上說

address_len指定sockaddr結構體的長度由地址參數指向 到 。 ..... 如果地址參數不是空指針並且協議提供了消息的源地址,則接收到的消息的源地址存儲在地址參數指向的sockaddr結構中,並且長度的地址存儲在由address_len參數指向的 對象中。

+0

耶,分配值addlen後,它的工作原理,由我不明白安靜,不addlen假設recvfrom的過程中被改變了嗎?爲什麼我需要首先爲其分配價值? – user2810081

0

我發現它更好地在這裏解釋:

在這種情況下,addrlen中爲以價值 結果參數。在調用之前,它應該初始化爲與src_addr關聯的緩衝區的大小 。返回後,addrlen將更新爲 以包含源地址的實際大小。

http://man7.org/linux/man-pages/man2/recv.2.html