Я начинаю узнавать о том, как реализовать на C++ TCP-сервер/клиент (в Windows и Linux). В настоящий момент я реализую сервер (и тестирование с помощью telnet как клиента). Серверное приложение отправляет и получает данные как шарм. (Я буду реализовывать клиент после понимания всей серверной части). Но мне нужно найти программный (C++ или OS API) способ запроса состояния сокета TCP (ESTABLISHED, FIN_WAIT_2, CLOSE_WAIT и т. Д.) Без использования функции write()/recv() для обработки исключения ошибки.Определить состояние TCP-сокета
Например:
- запускает сервер, связать сокет и ждать соединения
- а клиент начинает и подключения на сервере
- Вот, у меня есть цикл на сервере, что использовать Func " ioctlsocket (socket, FIONREAD, pbytes_available) ", чтобы определить, когда у меня есть данные для чтения.
- Если клиент отправляет некоторые данные, тогда «pbytes_available» будет> 1, а сервер будет использовать recv() для получения.
- Если клиент ничего не отправляет, сервер может выполнять другие задачи и проверять, есть ли данные в сокете в следующем цикле.
- Если я закрываю TELNET (процесс клиента) и запускаю «netstat», я увижу, что сокет сервера находится в состоянии «CLOSE_WAIT», поэтому мне нужно закрыть сокет на стороне сервера.
Это вопрос: Как я могу запросить состояние сокета TCP, чтобы определить, что мне нужно закрыть этот сеанс? (Без использования Send()/ПРИЕМ(), как и "NetStat" делать)
Примечание: Я попробовал "getsockopt (гнездо, SOL_SOCKET, SO_ERROR, & optval, & optlen)", но это возвращение 0, когда состояние ESTABLISHED/CLOSE_WAIT и «optval» также не изменяется.
Вы хотите использовать select() для поиска данных для чтения и исключений. Обратите внимание, что не все ОС сообщают вам, когда другой конец процесса сокета уходит. –
Я хочу получить состояние (например CLOSE_WAIT), например NETSTAT может ... – user2538743
Обычный API-интерфейс BSD не раскрывает эту информацию. Netstat должен использовать определенный способ ОС для получения информации. –