Я создаю несколько сокетов для отправки широковещательной передачи UDP на клиенте. На клиенте я также использую вызов блокировки recvfrom() для получения IP-адресов серверов, которые отвечают. Я решил создать поток для каждого вызова recvfrom(), потому что на серверах не было ответа, и это оставило бы меня зависанием. Я также создаю еще один поток, чтобы отслеживать время и выйти из программы. Скажем, я установил ограничение по времени на 5 секунд. Иногда я получаю ошибку 10004 ->http://support.ipswitch.com/kb/WSK-19980714-EM08.htmЛучший способ справиться с ошибкой winsock 10004
Вызванный потому что я окончание программы на блокирующем вызова
Как вы думаете, это нормально, чтобы просто обнаружить, если произошла ошибка в этом уверен и ничего не делать. Каков наилучший способ справиться с этим?
ie.
if((recvfrom(socket, (char *)buffer, size, 0, (struct sockaddr *) &fromAddr, &fromAddrLen)) == SOCKET_ERROR)
{
if(WSAGetLastError() == 10004)
//do nothing
else
printf("\nrecvfrom() failed with error code : %d" , WSAGetLastError());
}
Я использую потоки для recvfrom() нескольких разных сокетов (которые были созданы в зависимости от того, сколько интерфейсов имеет машина). Все хорошо? Когда вы предложили цикл или, возможно, таймер, я реализовал это с помощью потоков. Каков метод, о котором вы думаете? Я буду больше смотреть в неблокирующий режим, поскольку он кажется лучшим вариантом для меня, но когда я его пробовал, я помню, что встречался с ошибочной ошибкой и не слишком уверен в том, как с этим бороться. Большое спасибо за помощь! – John
Я закончил использовать Select() с тайм-аутом, как вы сказали, и получил его работу, а это значит, что мне больше не нужен таймер потока/любые таймеры! Еще раз спасибо Реми. – John