Почему закрытие сокета UDP не заставляет select возвращаться?

0

У меня есть выбор на FDSET, который включает несколько TCP-соединений и одно несвязанное соединение UDP. В окнах, когда я закрываю сокет для UDP-соединения из другого потока, он сигнализирует о возврате select. В Ubuntu, однако, это не так, почему?

  • 0
    покажи код или мы не сможем четко понять, что закрывается. также ваш выбор выбора массива FD? (описания файлов / сокеты)
  • 0
    из руководства: «Вероятно, неразумно закрывать файловые дескрипторы, когда они могут использоваться системными вызовами в других потоках в том же процессе. Поскольку файловый дескриптор может быть повторно использован, существуют некоторые неясные условия гонки, которые могут вызвать непреднамеренные побочные эффекты "
Показать ещё 3 комментария
Теги:
networking

1 ответ

2
Лучший ответ

Если это зависит от того, пытаетесь ли вы закрыть fd во время select или перед selectFD_SET). В обоих случаях по причинам, изложенным ниже, поведение не определено. Возможно, это делает одну вещь под Windows, но вы не можете положиться на нее.

Если вы пытаетесь закрыть fd во время select (т.е. После того, как был введен системный вызов select() но до его возвращения), тогда поведение не определено по причинам, изложенным здесь: Что делает select (2), если вы закрыть (2) файловый дескриптор в отдельном потоке?

Если вы пытаетесь закрыть fd перед selectFD_SET), тогда вы пытаетесь выполнить FD_SET затем select() в FD, который теперь закрыт, т.е. недействителен. Стандарт находится здесь: http://pubs.opengroup.org/onlinepubs/009695399/functions/select.html, и это говорит о том, FD_SET макрос FD_SET может даже не запрашивать select() для просмотра вашего FD.

Поведение этих макросов не определено, если аргумент fd меньше 0 или больше или равен FD_SETSIZE, или если fd не является допустимым файловым дескриптором, или если какой-либо из аргументов является выражением с побочными эффектами.

Если это произойдет (и только если это произойдет), select должен возвращать EBADF:

При следующих условиях pselect() и select() должны выйти из строя и установить errno в:

[EBADF] В одном или нескольких наборах дескрипторов файлов указан файловый дескриптор, который не является допустимым дескриптором открытого файла.

Но вы не можете знать, что это будет так, поскольку FD_SET может в равной степени просто игнорировать неверный дескриптор файла.

Для полноты, если вы делаете FD_SET перед close, но затем выполните select, вы увидите EBADF.

  • 0
    Нет, закрытие FD связано с моим нажатием кнопки. Поэтому я на 100% уверен, что на момент вызова для выбора, FD действителен.
  • 0
    Так что это в select() когда вы закрываете FD? В этом случае поведение самой select() не определяется стандартом POSIX (см. Ссылку, которую я отправил). IE может вернуться, а может и нет. См .: stackoverflow.com/questions/543541/…
Показать ещё 10 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню