Ничего не получил от recvfrom на окнах

У меня есть некоторые проблемы в Windows 8 с использованием recvfrom. У меня есть сокет, который связан с INADDR_ANY (0.0.0.0), и я хотел бы получить несколько пакетов на нем.

Проблема в том, что я вижу эти пакеты в Wireshark, но recvfrom никогда не сообщает мне, что полученный размер больше 0. Я пытался привязать сокет к 127.0.0.1 или даже к моему локальному IPv4-адресу, я ничего не получаю. Используется порт 7321 (локально)

Я использую библиотеку ENet для создания сокета, а затем я использовал этот сокет в recvfrom. Вот код, который никогда не возвращает ожидаемые пакеты.

uint8_t* buffer; // max size needed normally (only used for stun)
buffer = (uint8_t*)(malloc(sizeof(uint8_t)*2048));
memset(buffer, 0, 2048);

socklen_t from_len;
struct sockaddr addr;

from_len = sizeof(addr);
int len = recvfrom(m_host->socket, (char*)buffer, 2048, 0, &addr, &from_len); //m_host is of type ENetHost, the socket in it is a file descriptor like standard sockets

Как я уже сказал, это немного странно, так как Wireshark показывает мне пакеты (которые являются STUN-ответами, если хотите знать).

Может ли кто-нибудь помочь мне выяснить, чего не хватает, что может быть причиной этой проблемы?

0

Решение

Ваш addr переменная объявлена ​​как sockaddr, Это должно быть объявлено как sockaddr_in (работает только с IPv4) или SOCKADDR_STORAGE (работает как с IPv4, так и с IPv6), а затем введите его в sockaddr* при передаче его recvfrom(),

Кроме того, вы говорите, что recvfrom() не возвращается> = 0. Так что же на самом деле возвращает? Если он возвращает 0, то был получен пакет длиной 0 (невозможно для TCP, но возможно для UDP). Если он возвращает -1 (иначе SOCKET_ERROR), то произошла ошибка, поэтому используйте WSAGetLastError() чтобы узнать, что это за ошибка на самом деле.

0

Другие решения

Я могу подумать о 2 возможных причинах возникновения проблемы:

1) Возможно, вы не правильно указали порт на вашем sendto & Recv из сокета. Допустим, вы отправляете пакеты на порт 6000, но ваш recvfrom прослушивает порт 6001 или что-то еще. Просто дважды проверьте, что обе программы используют один и тот же порт.

2) Брандмауэр Windows. Я бы запустил программу как администратор, просто чтобы быть в безопасности, но также убедиться, что вы разрешаете вашей программе через брандмауэр Windows обмениваться данными через частные или публичные сети.

0

По вопросам рекламы [email protected]