Linux, сокеты, неблокирующее подключение
Я хочу создать неблокирующее соединение. Вот так:
socket.connect(); // returns immediately
для этого я использую другой поток, бесконечный цикл и Linux epoll. Вот так (псевдокод):
// in another thread
{
create_non_block_socket();
connect();
epoll_create();
epoll_ctl(); // subscribe socket to all events
while (true)
{
epoll_wait(); // wait a small time(~100 ms)
check_socket(); // check on EPOLLOUT event
}
}
Если я запускаю сервер и клиент, все работает. Если я сначала запускаю клиент, подождите некоторое время, запустите сервер, тогда клиент не подключается.
что я делаю не так? Может быть, это можно сделать по-другому?
1 ответов
вы должны использовать следующие шаги для асинхронного подключения:
- создать сокет с
socket(..., SOCK_NONBLOCK, ...)
- процесс пуска в связи с
connect(fd, ...)
- если возвращаемое значение не является ни
0
, ниEINPROGRESS
, затем прервать с ошибкой - подождите, пока
fd
сигнализируется как готов к выходу - проверьте состояние сокета с
getsockopt(fd, SOL_SOCKET, SO_ERROR, ...)
- сделал
нет петель-если вы не хотите обрабатывать EINTR
.
если клиент запускается первым, вы должны увидеть ошибку ECONNREFUSED
в последнем шаге. Если это произойдет, закройте сокет и начните с самого начала.
трудно сказать, что не так с вашим кодом, не видя более подробной информации. Я полагаю, что вы не прерываете на ошибках в вашем check_socket
операции.