bkelly13 Ответов: 2

Недопустимый аргумент для recvfrom(...)


Я пытаюсь создать простое UDP-приложение для захвата данных, отправляемых другим приложением. Когда код попадает в вызов метода recvfrom (), он возвращает -1, а WSAGetLastError возвращает 10022. Я не могу определить, что не так с аргументами. Вот объявления, настройка и вызов.
Пожалуйста, обратите внимание, что я не могу скопировать пасту из моего рабочего механизма сюда, и я прошу вас быть немного терпимыми к опечаткам.
Декларация

const unsigned in BUFLEN = 1024;
const char IP_ADDRESS[ ] = "192.10.11.33";
const unsigned int ETHERNET_PORT = 2055;
int receive_status = 0;
SOCKET  m_receive_socket;
char       buff[ FUBLEN ];
STRUCT  sockaddr_in  m_socket_address_in
int  sock_address_size;


Инициализация

sock_address_size = sizeof( m_socket_address_in );
m_receive_socket = socket( AF_INET, SOCK_DGRAM, IPPROTO_UDP);
// error check from previous line not shown, did not return SOCKET_ERROR
memset( (char *) &m_socket_address_in, 0, sizeof( m_socket_address_in) );
m_socket_address_in.sin_family = AF_INET;
m_socket_address_in.sin_port =  htons( ETHERNET_PORT );
m_socket_address_in.sin_addr.S_un.S_addr = INET_ADDR( IP_ADDRESS );


Код
receive_status = recvfrom( m_receive_socket,  // value = 264
                                buff,
                                BUFLEN,            // value = 1024
                                0,
                                (struct sockaddr * ) &m_socket_address_in,
                                &sock_address_size );   // value = 16


Я посмотрел на аргументы и не могу признать их недействительными. Понятно ли это кому-то с большим опытом?

Что я уже пробовал:

Я посмотрел на значения аргументов. Адреса выглядят действительными.

Richard MacCutchan

Я думаю,что вы неправильно настроили розетки. m_receive_socket должен содержать IP-адрес, порт и т. д. То m_socket_address_in пакет заполняется при получении сообщения.

2 Ответов

Рейтинг:
2

Jochen Arndt

Вы не связали розетку. См. функция recvfrom (Windows)[^]:

Цитата:

WSAEINVAL
Сокет не был привязан с помощью bind, или был указан неизвестный флаг, или MSG_OOB был указан для сокета с включенной SO_OOBINLINE, или (только для сокетов в стиле байтового потока) len был равен нулю или отрицательному значению.

См. также приведенную выше ссылку для примера кода:
// Bind the socket to the specified address and port.
m_socket_address_in.sin_family = AF_INET;
m_socket_address_in.sin_port = htons(ETHERNET_PORT);
m_socket_address_in.sin_addr.s_addr = htonl(IP_ADDRESS);
int bind_status = bind(m_receive_socket, (SOCKADDR *) &m_socket_address_in, sizeof (m_socket_address_in));

// Wait for data and retrieve
sockaddr_in SenderAddr;
receive_status = recvfrom(m_receive_socket,
                          buff, sizeof(buff),
                          0,
                          (struct sockaddr * )&SenderAddr,
                          sizeof(SenderAddr));


Рейтинг:
0

bkelly13

В РМ,
Спасибо за ответ.
Объявление m_receive_socket в моем коде

SOCKET  m_receive_socket;

Когда сокет преследуется вниз определение таково
typedef UINT_PTR SOCKET

Я не знаю, как элемент сокета может содержать IP-адрес.


Richard MacCutchan

Ну, я нашел это только по счастливой случайности, так как это а)не решение, и б) не было опубликовано в ответ на мой комментарий, и в) не имеет никакого отношения к моему комментарию. Вы заполнили детали неправильной структуры sockaddr, поэтому вы получаете ошибку 10022. Вам нужно заполнить детали в структуру, которую должна прослушивать функция recvfrom, а не ту, которая будет заполнена из полученного сообщения.