У меня есть некоторые проблемы в 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-ответами, если хотите знать).
Может ли кто-нибудь помочь мне выяснить, чего не хватает, что может быть причиной этой проблемы?
Ваш addr
переменная объявлена как sockaddr
, Это должно быть объявлено как sockaddr_in
(работает только с IPv4) или SOCKADDR_STORAGE
(работает как с IPv4, так и с IPv6), а затем введите его в sockaddr*
при передаче его recvfrom()
,
Кроме того, вы говорите, что recvfrom()
не возвращается> = 0. Так что же на самом деле возвращает? Если он возвращает 0, то был получен пакет длиной 0 (невозможно для TCP, но возможно для UDP). Если он возвращает -1 (иначе SOCKET_ERROR
), то произошла ошибка, поэтому используйте WSAGetLastError()
чтобы узнать, что это за ошибка на самом деле.
Я могу подумать о 2 возможных причинах возникновения проблемы:
1) Возможно, вы не правильно указали порт на вашем sendto & Recv из сокета. Допустим, вы отправляете пакеты на порт 6000, но ваш recvfrom прослушивает порт 6001 или что-то еще. Просто дважды проверьте, что обе программы используют один и тот же порт.
2) Брандмауэр Windows. Я бы запустил программу как администратор, просто чтобы быть в безопасности, но также убедиться, что вы разрешаете вашей программе через брандмауэр Windows обмениваться данными через частные или публичные сети.