Программирование сокетов: Сервер - PullRequest
1 голос
/ 08 июля 2011

Хорошо, поэтому я пытался научить себя программированию сокетов.Я написал небольшое приложение на C # с асинхронным сервером, и я понимаю большую его часть, за исключением следующего:

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

Спасибо за все ваши ответы

Редактировать: Насколько я понимаю, поток прослушивания прослушивает порт по умолчанию, но все сообщения затем обрабатываются в разных сокетах для каждого клиента?

Редактировать еще раз: как вы, ребята, неправильно понимаетемой вопрос.Я понимаю нормальное сокетное общение.Моя проблема с асинхронным сервером, где прослушивающий сокет отличается от соединительного сокета.То есть.

  1. Сервер прослушивает порт по умолчанию
  2. Клиент запрашивает соединение для подключения.
  3. Запрос получателя сервера.
  4. Затем сервер создает сокет связимежду клиентом и сервером и продолжает прослушивать порт по умолчанию.

Моя проблема на последнем шаге.Как клиент теперь знает, как общаться в новом сокете?Вот пример кода http://msdn.microsoft.com/en-us/library/5w7b7x5f.aspx

Ответы [ 4 ]

3 голосов
/ 08 сентября 2012

Хотя этот вопрос был опубликован более года назад, я считаю, что стоит попытаться уточнить (или запутать?) Его немного подробнее.

"Как клиент теперь знает, как общаться в новом сокете?" - Клиент не знает, что был создан новый сокет. Он просто продолжает посылать данные (пакеты) на один и тот же порт.

Однако это вызывает другой вопрос: как сервер узнает, какие данные поступают с какого клиента? - Благодаря протоколам TCP и IP сервер знает как адрес клиента, так и порт источника, с которого были отправлены пакеты. С помощью этой информации сервер может получать пакеты от нескольких клиентов и нескольких (клиентских) портов и направлять их в правильный сокет. В этом вопросе рассмотрите сокеты сервера как фильтры: когда пакеты получены от клиентского X-порта Y, затем направьте их в сокет Z.

"... теперь он знает, что ему нужно общаться через другой сокет / порт?" - Это частый источник путаницы. Когда на сервере создается новый сокет для приема пакетов (после установления соединения), он не использует новый порт, он продолжает использовать исходный номер порта. Весь процесс создания сокета на стороне сервера прозрачен для клиента. Клиент никогда не знает (и не должен знать), что был создан новый сокет для обработки его пакетов.

Заголовок Google TCP для получения дополнительной информации.

Надеюсь, это кому-нибудь поможет.

1 голос
/ 08 июля 2011

Когда клиент подключается к серверу, он выбирает порт для подключения.У клиента также есть порт, на который он будет получать ответы.Обычно это случайно выбранный порт, но клиент может переопределить его.

Думайте об этом как о телефонном звонке.Когда вы звоните кому-то, есть номер телефона, по которому вы звоните, и у вас также есть номер телефона.даже если вы оба разговариваете друг с другом, оба телефонных номера используются.

Это не идеальная аналогия, поскольку телефонные номера больше похожи на IP-адреса, и во всех случаях магистральные линии не обязательно должны иметь исходный номер телефонано применяется та же концепция.

Проще говоря, протокол TCP требует исходного порта и порта назначения, а также исходного IP-адреса и IP-адреса назначения.Когда пакеты отправляются в любом направлении, соответствующий IP / порт используется в любом случае.

0 голосов
/ 08 июля 2011

Определения

  • Клиент: сокет на удаленном компьютере, который подключается к серверу
  • Сервер: сокет, ожидающий соединения на сервере
  • ServerClient: сокет, который связывается с клиентом

Ответ

Я не смог найти подробностей о том, как порт ServerClient переносится на Client после того, как Server принял его. Но это, скорее всего, передается в рукопожатии. Не стесняйтесь читать RFC793, если вы хотите узнать больше.

Я не буду вдаваться в подробности, но вы можете прочитать о пассивных соединениях, чтобы получить больше информации о том, как сокеты слушателя работают на более низких уровнях. Но в основном цель сокетов слушателя (Server) состоит только в том, чтобы принимать сокеты (ServerClient).

Порт, который использует ServerClient, назначается реализацией сокетов в операционной системе и не является чем-то, что вы можете контролировать. Все, что вам нужно знать, это то, что каждый подключенный ServerClient получит свой собственный порт, и он будет передан Client во время (трехходового) рукопожатия ( я думаю;) )

0 голосов
/ 08 июля 2011

На самом деле новое соединение использует тот же порт. Сервер прослушивает определенный порт для входящего соединения, каждый раз, когда он получает запрос на соединение от клиента, сервер принимает его и создает новый поток для обработки запроса. А затем продолжайте прослушивать этот порт.

...