Я столкнулся с проблемой во время разработки моего клиентского приложения.
Я хочу использовать неблокирующие сокеты UDP в своем приложении для связи с сервером. Я использую библиотеку winsock2
в Windows.
Но... Почему-то у меня странное поведение функции select()
при некоторых условиях:
- Сокет не имеет привязанного адреса и порта (это сокет на стороне клиента, поэтому он не нужен).
- Before
select()
I send data to my local address and some port withsendto
call.- For example:
192.168.1.2
- For example:
В этих условиях select()
мгновенно (даже не дожидаясь тайм-аута) возвращает 1
. Как будто у меня есть какой-то пакет, готовый к приему. Но если вызвать recvFrom
, то он обязательно вернет -1
.
- Если я отправляю свои пакеты от клиента на любой другой адрес (который не является моим адресом в локальной сети), тогда
select()
работает по назначению. - Также
select()
работает по назначению, если не отправлять пакеты на любой адрес перед вызовомselect()
.
Метод инициализации сокета:
bool CUdpSocket::initialize()
{
_handle = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
... error processing code, returns false if error...
}
Метод, который использует select()
. Этот метод отлично работает для сокета сервера (с привязанным адресом и портом).
bool CUdpSocket::waitData(s32 timeout_ms)
{
fd_set readset;
int result;
struct timeval tv;
// Initialize the set.
FD_ZERO(&readset);
FD_SET(_handle, &readset);
// Initialize time out struct.
tv.tv_sec = 0;
tv.tv_usec = timeout_ms * 1000;
result = select(_handle + 1, &readset, NULL, NULL, &tv);
// Timeout with no data.
if (result == 0) {
return false; // Get out of here!
}
// Error.
if (result < 0) {
// TODO: Maybe throw exception or do something.
return false;
} else if (!FD_ISSET(_handle, &readset)) {
return false; // No data!
}
// There is some data!
return true;
}
recvfrom()
вернет -1 с какой ошибкой? - person user207421   schedule 30.06.2018recvFrom
возвращает код 10054 (WSAECONNRESET). - person zcaliptium   schedule 30.06.2018