Как узнать, что у сокета уже есть адрес?

Рейтинг: 0Ответов: 1Опубликовано: 19.06.2023

В общем, моё приложение пересоздает сокет, обновляя в каждом экземпляре клиента сокет user полученный от метода accept в случае если клиент до сих пор думает что соединение установлено, а сервер при попытке отправить клиенту команду выдаёт исключение:

ConnectionAbortedError: [WinError 10053] Программа на вашем хост-компьютере разорвала установленное подключение

Я также понимаю что клиент считает что по прежнему подключен, исходя из логов, там видно что отключения будто бы и не было, точнее поток dataOutputStream получает null pointer exception в случае если явно закрыть сокет сервера.

Мне нужно как-то узнать, выпало ли WinError 10053 из-за того что на стороне сервера перебой или же просто отключился клиент, но если клиент отключился и перебоя на стороне сервера не было, при попытке пересоздать сокет, выпадет исключение:

OSError: [WinError 10048] Обычно разрешается только одно использование адреса сокета (протокол/сетевой адрес/порт)

Это значит, что адрес у сокета есть и ос его не закрывала. Тут та я и хочу, на всякий, избежать исключения, проверив есть ли у сокета сервера уже привязанный адрес, но методу socket.getsockname() я не знаю следует ли доверять в моём случае, поэтому и ищу ответ на вопрос: Как проверить, удостовериться что адрес у сокета есть?

Ответы

▲ 0

socket.getsockname() - не даёт узнать привязан ли хост и порт к сокету, а лишь даёт инфу какие хост и порт вообще устанавливались при последнем успешном привязывании - socket.bind(host, port).

в моём случае, решением стало просто обработать 2е исключение, т.к оно происходит лишь если сокет сервера соединение не разрывал(явно и неявно тоже), а значит дело в клиенте.

Далее уже на стороне клиента требуется реализовать повторное соединение.