Могу ли я принять соединение и заставить его умереть без моего ведома, а затем принять другое соединение с тем же номером сокета? - PullRequest
1 голос
/ 09 марта 2010

Могу ли я принять соединение и заставить его умереть без моего ведома, а затем принять другое соединение с тем же номером сокета?

У меня есть поток для анализа протокола и создания ответа.У меня есть другой поток для обработки всех моих сетевых операций ввода-вывода и еще один поток для обработки новых входящих запросов на подключение.Всего три темы.Используя select в потоке ввода-вывода, я получаю ошибку и вынужден искать мертвый сокет.Я боюсь, что есть случай, когда accept может захотеть принять новое соединение на номер сокета, который был ранее мертвым.

Я бы предположил, что это не может произойти, пока я "shutdown () || close ();"сокет, который может быть мертвым на стороне сервера.Если это могло случиться, является ли единственным решением настроить мьютексы, чтобы остановить все, пока я разбираюсь, какие сокеты помешали?

Спасибо, Ченц

1 Ответ

2 голосов
/ 09 марта 2010

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

Предполагая, что мы говорим о TCP, тогда, если удаленная сторона закроет свою сторону отправки соединения, вы получите recv(), возвращающий 0 байтов, чтобы сообщить вам об этом. Так как TCP поддерживает полузакрытые соединения, вы все равно сможете отправлять данные на удаленную сторону соединения (если ваш протокол уровня приложения создан таким образом), или вы можете принять тот факт, что удаленная сторона закрыта его отправляющая сторона в качестве указания на то, что вы должны сделать то же самое.

Вы используете shutdown(), чтобы закрыть либо сторону отправки, либо сторону возврата, либо обе стороны соединения. Вы используете close(), чтобы закрыть сокет и освободить дескриптор / дескриптор для повторного использования.

Итак, в ответ на ваш вопрос. Нет, вы не сможете принять другое соединение с тем же дескриптором сокета, пока не вызовете close() для того дескриптора, который у вас уже есть.

Вы МОЖЕТЕ принять соединение по новому дескриптору сокета; но это, вероятно, не проблема для вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...