|
|
|
select on connection
|
|||
|---|---|---|---|
|
#18+
Есть следующая ситуация: Клиент коннектиться к серверу, На сервере создается обрабатывающий процесс. Потом обрабатывающий процесс вызывает метод 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. Может какие-то опции добавить или убрать при создании сокета? Кто что может предложить? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2007, 12:53:53 |
|
||
|
select on connection
|
|||
|---|---|---|---|
|
#18+
/socketЕсли в это время на клиенте, например выдернуть патч-корд, то по сути коннект обрывается, но обрабатывающий процесс как висел на select-е так и висит и он не осведомлен, что клиент оборвал связь. Нет, коннект при этом не обрывается. Протокол TCP разрабатывался для военных нужд и вполне способен выживать в таких условиях - предполагается, что связь может восстановиться, например, через другой маршрут. Поэтому, есть три способа - дождаться окончания таймаута в select, уменьшить время KEEP_ALIVE (это делается в зависимости от операционки), и третий - периодически посылать свой пакеты keep-alive. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2007, 13:26:15 |
|
||
|
|

start [/forum/topic.php?fid=57&fpage=273&tid=2028020]: |
0ms |
get settings: |
5ms |
get forum list: |
14ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
52ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
33ms |
get tp. blocked users: |
1ms |
| others: | 206ms |
| total: | 325ms |

| 0 / 0 |
