C # - Несколько TCP-соединений на один порт? - PullRequest
7 голосов
/ 17 октября 2010

Что мне интересно, так это разрешено ли мне это делать

client_db.clients[numberOfClients].sock = listener.Accept();

Для моего сетевого класса я пишу чат-клиент и сервер, к которому он подключается. У меня есть массив клиентских объектов, который содержит различную информацию о каждом из людей, подключающихся к серверу. Раньше, когда я имел дело с одним клиентом, у меня был сокет, равный listener.Accept, и тогда я делал бы все свои вещи с этим сокетом. Я неправильно предположил, что мог бы использовать массив сокетов для нескольких соединений TCP с несколькими клиентами.

Есть ли способ сделать это? Я понимаю, что, возможно, есть более эффективные способы сделать это, но я все еще изучаю сетевое программирование, и, что более важно, мой сервер в настоящее время основан на идее использования массива сокетов. Если нет способа сделать это, я обязательно запомню этот урок.

РЕДАКТИРОВАТЬ: у меня сложилось впечатление, что это не сработало, потому что я получил исключение, сказав что-то о "не может быть несколько соединений", хотя я не могу получить это исключение снова. Теперь я получаю объектную ошибку. Я в замешательстве, мне нужно еще немного разобраться в этом ..

1 Ответ

33 голосов
/ 17 октября 2010

С помощью TCP вы можете иметь только один процесс, прослушивающий порт, но когда он принимает соединение (как ваше), вы получаете совершенно другой дескриптор сокета для продолжения сеанса, поэтому вы можете вернуться и прослушатьоригинальный дескриптор сокета для другого соединения.

Уникальность в TCP на уровне сеанса.Другими словами, 5-кортеж (source-ip, source-port, dest-ip, dest-port, protocol) должен быть уникальным, чтобы пакеты не могли запутаться в том, куда они направляются.

Вы можете иметь тысячи клиентов, разговаривающих с данной парой dest-ip / dest-port (например, большое количество людей, набравших stackoverflow.com:80 прямо сейчас).

Так что да, вы являетесь разрешено делать то, что вы делаете.

То, что вы можете найти, - это если вы попытаетесь подключиться к этому порту, пока есть сеансы в состоянии TIME_WAIT, вы не будетеразрешено связывать.Это сделано для того, чтобы не дать входящим пакетам из любой предыдущей сессии в сети и испортить вашу сессию.

Дополнительную информацию о TIME_WAIT и причинах ее необходимости можно найти в этого превосходного ответа :-)

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