Портирование программы Windows Socket для Unix: альтернатива для winsock32 API в Unix - PullRequest
0 голосов
/ 15 июня 2010

В Socket Programming, как поток Unix получит событие Socket CLOSE от клиента, если соединение закрыто?

Существуют ли какие-либо API, которые будут уведомлять поток Unix о полученном событии CLOSE?

Как и в Windows, у нас есть API WSAEnumNetworkEvents, который получает уведомление о событии для указанного дескриптора сокета.Каким будет эквивалентный API, используемый при программировании сокетов Unix?

Пожалуйста, предоставьте справку для запроса.

Ответы [ 4 ]

2 голосов
/ 15 июня 2010

Вы можете отслеживать событие закрытия при выполнении чтения.Сокет закрывается, когда read возвращает 0 (конечно, речь идет о "сокетах Беркли").

// РЕДАКТИРОВАТЬ: используйте poll или select, чтобы дождаться, когда произойдет какое-либо событие (получение данныхзакрытие гнезда ...).

0 голосов
/ 15 июня 2010

libevent позволит вам получить событие, когда в сокете есть данные или когда сокет необходимо закрыть.Точнее, вы хотите настроить сокет так, чтобы он уведомлял вас о событии чтения (EV_READ) и в функции обратного вызова функции проверял, равно ли возвращаемое значение из recv 0, что указывает на то, что сокет на другом конце отключился, или -1, что указываетошибка.В первом случае, когда возвращаемое значение равно 0, вы хотите закрыть сокет.Во втором случае, когда возвращение -1 указывает на какую-то «ошибку», то, что вы делаете, зависит от характера ошибки.Например, recv может вернуть -1 и установить для errno значение EINTR, указывающее, что функция была прервана, например, через прерывание SIGUSR1.Как вы справитесь с этим, зависит от того, что должно делать ваше приложение.

0 голосов
/ 15 июня 2010

Думали ли вы об использовании boost :: asio , чтобы вы могли обмениваться хотя бы кодом между linux и windows. Накладные расходы не так велики по сравнению с голыми сокетами, и вы получаете преимущество лучшей семантики. Многие части кода из boost перетекали в стандартный C ++, поэтому код довольно высокого качества.

Это включает в себя переписывание вашего программного обеспечения, что может быть невозможным. С другой стороны, вам нужно поддерживать общую кодовую базу.

0 голосов
/ 15 июня 2010

Извините, нет времени на ответ, но посмотрите Руководство Beej по сетевому программированию

...