2016-05-17 4 views
-1

Я пишу простое приложение udp-сервера, и я столкнулся с ошибкой, когда пытаюсь получить адрес удаленного пользователя.recvfrom() всегда возвращает нулевой удаленный адрес

while(run == 1) { 
    struct sockaddr_in client_addr; 
    char message[1024]; 
    int len = recvfrom(sockfd, message, 1024, 0, (struct sockaddr*)&client_addr, sizeof client_addr); 

    printf("Received request from: %s#%d\n", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port)); 
} 

Он всегда возвращает удаленный адрес: 0.0.0.0 # 0

+4

Последний параметр должен быть указателем. Он также возвратил -1 и установил errno на EFAULT, случайно? – immibis

+0

возвращает -1, а сообщение об ошибке: Плохой адрес – mateass

+0

Этот код даже не компилируется. Вы компилируете в разрешающем режиме? Тебе не следует! – SergeyA

ответ

3

Если вы читаете документацию для recvfrom, вы увидите, что последний параметр является указателем на socklen_t держит размер адрес.

Так оно и должно быть:

socklen_t client_addr_len = sizeof client_addr; 
int len = recvfrom(....., (struct sockaddr*)&client_addr, &client_addr_len); 

После вызова recvfrom, client_addr_len проведет фактическую длину адреса (который может быть меньше, чем буфер, в теории, если это не AF_INET адрес).

1

Последний аргумент для вашего звонка recvfrom() неверен. Предполагается, что указатель типа socklen_t *, указывая на место, где первоначально был сохранен размер адреса. Функция изменяет значение, хранящееся там, чтобы отразить фактический размер структуры адреса, поскольку он написали его или как он имел бы, если бы начальный размер был достаточно большим. Вместо этого вы передаете фактический размер, который должен быть неявно преобразован в указатель. Ваш компилятор должен предупредить вас об этом.

Учитывая, что программа не сбой, recvfrom() должен успешно считывать значение с адреса, на которое указывает преобразованное целое число, и успешно записывать там значение. Вполне возможно, он считывает значение 0.

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