Boost Asio
Определение сервером факта отключения клиента
Добрый день.
Имеется код(некоторые очевидные участки скрыты)
...
void client_session(tcp::socket socket) {
string st;
try {
while(true) {
cout << "Enter st:" << endl;
cin >> st;
socket.write_some(buffer(st));
}
}
catch (exception &e) {
socket.close();
cout << e.what() << endl;
}
}
...
int main() {
...
tcp::socket socket(bService);
bAcceptor.accept(socket);
thread th(client_session, move(socket));
th.join();
return 0;
}
1) Подключаюсь к нему с локального ПК или другого(в контексте данного вопроса не имеет значения) командой:
nc localhost 30055
3) На сервере тем временем продолжает отображаться строка «Enter st:»;
4) На сервере ввожу строку «qwe123», нажимаю ВВОД и далее оператор write_some отрабатыет успешно, исключение не выпадает;
5) На сервере ввожу вторую строку «rty456», нажимаю ВВОД и далее при выполнении оператора write_some выпадает исключение(текст e.what(): «write_some: Broken pipe»);
Также приведу сокращенный лог wireshark во время выполнения данных манипуляций:
Клиент -> Сервер [SYN]
Сервер -> Клиент [SYN, ACK]
Клиент -> Сервер [ACK]
- нажимаю CRTL+C со стороны клиента
Клиент -> Сервер [FIN, ACK]
Сервер -> Клиент [ACK]
- на сервере ввожу первую сроку "qwe123" и ВВОД
Сервер -> Клиент [PSH, ACK] (в данном пакете как раз есть введенная строка "qwe123")
Клиент -> Сервер [RST]
- на сервере ввожу вторую строку "rty456" и ВВОД
- в wireshark больше ничего не добавляется, на сервере выпадает
исключение и соответственно отображается строка "write_some: Broken pipe" (e.what())
1) Почему исключение не выпадает при первом операторе write_some?
2) Eсть ли какие-то параметры tcp::socket, которые влияют на данное поведение и как их использовать?