UDP и сокеты, recvfrom () возврат-1 и ресурс, временно недоступный

У меня есть клиент и сервер, общающийся с датаграммами (UDP) в C. Клиент отправляет 5 msgs и после получения msgs, сервер передает msgs обратно. Получение и отправка сообщений являются большими, пока клиент не закончил получать msgs. После сервера, передающего весь msgs обратно, это завершает использование близко (). так recvfrom () от клиента должен возвратиться 0, правильно?

Принятие recvfrom () должно возвратиться 0 на завершение () от стороны сервера, это возвращается-1 вместо этого, с ошибочным Ресурсом, временно недоступным. Действительно ли этот ресурс является ссылкой на закрытый сокет с сервера? Или это для чего-то еще совершенно различного как разряжение буфера или чего-то (который я не думаю, верно)?

Принятие моего предположения было неправильным, и-1 возвращается, потому что сервер завершился, я, вероятно, должен обработать ошибку с

if(SOMEMACRO)
   do something 

Как я узнаю что SOMEMACRO ? Я распечатываю ошибку, но она говорит, что недоступный временный файл ресурса и recvfrom () описание не упоминает о unavilable ресурсе..?

Btw, это - не блокирующийся сокет, если это имеет какое-либо значение, так как я считал, что, если бы O_NONBLOCK установлен и никакие msgs не доступны, это установило бы errno на EAGAIN или EWOULDBLOCK. O_NONBLOCK не установлен, но MESSAGE_DONTWAIT установлен. Они - в основном то же самое, где O_NONBLOCK для общих дескрипторов файлов, и MESSAGE_DONTWAIT является конкретным сокетом??

Мой мозг не работает весь настолько большой теперь, если кто-то мог бы просветить меня и разъяснить то, о чем мой беспорядок, я глубоко ценил бы его.Спасибо!

8
задан Gibolt 6 September 2018 в 17:03
поделиться

2 ответа

UDP - это протокол без статических данных, в отличие от TCP, который ориентирован на соединение. Ваш принимающий код не будет знать, закрыл ли отправитель свой сокет или нет, он только знает, есть ли данные, ожидающие чтения. Согласно man-странице для recvfrom в Linux:

Если на сокете нет сообщений, вызовы receive ожидают прихода сообщения, если только сокет не является неблокирующим (см. fcntl(2)), в этом случае возвращается значение -1, а внешняя переменная errno устанавливается в EAGAIN.

Похоже, это то, что происходит у вас

Редактировать: Обратите внимание, что "ресурс временно недоступен" и EAGAIN - это одна и та же ошибка, просто пользовательское описание отличается от названия определения. По сути, она просто говорит вам, что вы пытаетесь читать из сокета, а данных для чтения нет

15
ответ дан 5 December 2019 в 10:02
поделиться

После того, как вы закрыли гнездо, оно еще некоторое время остается. Обычно около двух минут или около того. Чтобы избежать этого, используйте опцию сокета SO_REUSEADDR.

Вот некоторые ссылки для вас.

http://msdn.microsoft.com/en-us/library/ms740476%28VS.85%29.aspx http://docs.hp.com/en/B2355-90136/ch03s01.html

А вот пример, прокрутите вниз до функции udp_listen:

http://www.codase.com/search/display?file=L2dlbnRvbzIvdmFyL3RtcC9yZXBvcy9jb2Rhc2UuYy9zbGlycC0xLjAuMTYvd29yay9zbGlycC0xLjAuMTYvc3JjL3VkcC5j&lang=c&off=15730+15796+

2
ответ дан 5 December 2019 в 10:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: