powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / select on connection
2 сообщений из 2, страница 1 из 1
select on connection
    #34862922
/socket
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть следующая ситуация:
Клиент коннектиться к серверу,
На сервере создается обрабатывающий процесс.
Потом обрабатывающий процесс вызывает метод select и на select-е и ждет ожидания прихода данных от клиента

int s = select(FD_SETSIZE, &readset, NULL, NULL, &t);

Если в это время на клиенте, например выдернуть патч-корд, то по сути коннект обрывается, но обрабатывающий процесс как висел на select-е так и висит и он не осведомлен, что клиент оборвал связь.
Сервер создаю так:
_srv_socket = socket(PF_INET, SOCK_STREAM, 0)

flag = 1;
::setsockopt(_srv_socket, SOL_SOCKET, SO_REUSEADDR, &flag, sizeof(int));

::setsockopt(_srv_socket, SOL_SOCKET, SO_REUSEPORT, &flag, sizeof(int));

int data = 1;
::setsockopt(_srv_socket, SOL_SOCKET, SO_KEEPALIVE, &data, sizeof(data));

addr.sin_family = AF_INET;
addr.sin_port = htons(port);
addr.sin_addr.s_addr = INADDR_ANY;

bind(_srv_socket, reinterpret_cast<struct sockaddr *>(&addr), sizeof(addr));

listen(_srv_socket, 5);

...

Как сделать так, чтобы сервер уведомился, что клиент разорвал коннект, так как select должен быть бесконечный в обрабатывающем процессе, т.е.

типо такого

while(1) {
int s = select(FD_SETSIZE, &readset, NULL, NULL, &t);
if (s < 0) {
break;
}
}

Когда на клиенте делаю программный разрыв соединения, то все нормально. И select возвращает -1.
Может какие-то опции добавить или убрать при создании сокета? Кто что может предложить?
...
Рейтинг: 0 / 0
select on connection
    #34863076
teras
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
/socketЕсли в это время на клиенте, например выдернуть патч-корд, то по сути коннект обрывается, но обрабатывающий процесс как висел на select-е так и висит и он не осведомлен, что клиент оборвал связь. Нет, коннект при этом не обрывается. Протокол TCP разрабатывался для военных нужд и вполне способен выживать в таких условиях - предполагается, что связь может восстановиться, например, через другой маршрут. Поэтому, есть три способа - дождаться окончания таймаута в select, уменьшить время KEEP_ALIVE (это делается в зависимости от операционки), и третий - периодически посылать свой пакеты keep-alive.
...
Рейтинг: 0 / 0
2 сообщений из 2, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / select on connection
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]