2013-10-24 3 views
0

, когда i 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 выглядит как номер порта, но это номер порта этого приемника ... какая-либо одна есть идеи, почему это спасибо? много oh, еще одна вещь, я использовал это в цикле 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

Смежные вопросы