Имеется внешнее устройство, подключаемое по Ethernet. Принцип управления им следующий: с компа на устройство посылаем UDP-пакет из 8 байт данных определенного вида. В ответ устройство начинает посылать UDP-пакеты с данными, которые нужно обрабатывать. Передача еще одного UDP-пакета из 8 байт данных "выключает" устройство. Для взаимодействия с устройством используется WinSock.
Код инициализации:
| Код | WSAStartup(MAKEWORD(2,2), &m_wsaData); m_UDP_socket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); memset( &m_service, 0, sizeof(m_service) ); m_service.sin_family = AF_INET; m_service.sin_addr.s_addr = inet_addr( IP_ADDRESS.c_str() ); m_service.sin_port = htons( PORT_NUMBER );
|
Отправка данных на устройство:
| Код | sendto( m_UDP_socket, p_buff, len, 0/*flags*/, (SOCKADDR *)&m_service, sizeof(m_service));
|
Прием данных:
| Код | setsockopt( m_UDP_socket, SOL_SOCKET, SO_RCVTIMEO,(const char *)&m_timeout , sizeof(m_timeout)); // timeout = 1000 sockaddr_in sender; int sender_sz = sizeof (sender);
int res = recvfrom( m_UDP_socket, m_p_buffer, m_len, 0, (SOCKADDR*)&sender, &sender_sz );
|
Команда включения уходит на устройство нормально, но функция recvfrom возвращает код ошибки WSAETIMEDOUT. При этом в сниффере я вижу, что UDP-пакеты с данными от устройства исправно сыпятся. Где может быть проблема? |