2014-10-10 3 views
0

Я создаю несколько сокетов для отправки широковещательной передачи 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()); 
} 

ответ

0

Не используйте несколько потоков для чтения из одного гнезда одновременно. Не используйте поток для обработки вашего таймаута. Все, что вам нужно, это простой цикл, возможно, таймер. Чтобы обойти проблему блокировки, поместите сокет в неблокирующий режим или используйте select() с таймаутом, чтобы узнать, когда безопасно звонить recvfrom() без блокировки или использовать setsockopt(SOL_SOCKET, SO_RCVTIMEO) для установки таймаута при блокировании чтения.

+0

Я использую потоки для recvfrom() нескольких разных сокетов (которые были созданы в зависимости от того, сколько интерфейсов имеет машина). Все хорошо? Когда вы предложили цикл или, возможно, таймер, я реализовал это с помощью потоков. Каков метод, о котором вы думаете? Я буду больше смотреть в неблокирующий режим, поскольку он кажется лучшим вариантом для меня, но когда я его пробовал, я помню, что встречался с ошибочной ошибкой и не слишком уверен в том, как с этим бороться. Большое спасибо за помощь! – John

+0

Я закончил использовать Select() с тайм-аутом, как вы сказали, и получил его работу, а это значит, что мне больше не нужен таймер потока/любые таймеры! Еще раз спасибо Реми. – John

Смежные вопросы