2016-07-16 4 views
0

демультиплексор может контролировать много сокетов FDS событий с помощью этого метода:как же демультиплексор уведомления, когда OP_ACCEPT событие произошло

int select (int n, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);

из параметров, то считываются события, запись события и события исключения, но где событие accept?

ответ

1

Это событие чтения на сервере ServerSocket. Руководство страница select(2):

Для того, чтобы получать уведомления о входящих соединениях на сокете, вы можете использовать выбор (2) или опрос (2). При чтении нового соединения будет отображаться , после чего вы можете вызвать accept(), чтобы получить сокет для этого соединения.

+0

Как «Селектор» сообщает о двух читаемых событиях отдельно? – JasonHuang

+0

Вы не можете использовать одиночный сокет в режимах сервера и клиента одновременно. После того, как вы вызываете 'listen()' в сокете, он становится сокетом сервера и может использоваться только для приема удаленных клиентов. Если вы затем вызовете 'connect()' в том же сокете, он вернет ошибку EISCONN («уже подключенную»). – gudok

+0

Не будет. Он еще не подключен. Вероятно, он вернет EINVAL. – EJP