О C # UDP сокетах - PullRequest
       31

О C # UDP сокетах

3 голосов
/ 03 мая 2010
  • Я должен подключиться к внешнему серверу с помощью сокетов UDP в C # ..
  • Я не смог понять эти 2 строки в примечаниях по использованию сервера:

«Использование выделенных сокетов является обязательным.»

и

«Если сервер потеряет связь UDP с клиентом, он будет ...»

Я думал, что сокет UDP не подключен! Так что же значит «потерять связь»? и как этого избежать? Есть ли известный способ обеспечения «выделенных сокетов»?

Спасибо

Ответы [ 2 ]

3 голосов
/ 03 мая 2010

"Использование выделенных розеток исполнение. "

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

РЕДАКТИРОВАТЬ: просто чтобы расширить это, с точки зрения серверов.

UDP-сокеты не идентифицируются удаленный адрес, но только по местному адрес, хотя каждое сообщение имеет связанный удаленный адрес. (источник) .

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

"Если сервер теряет связь UDP с клиентом это будет ... "

Возможно потерять связь с UPD, например, какая-либо из конечных точек в соединении потеряна, скажем, я иду на сервер и вытаскиваю штекер?

EDIT2: Дэн Брайант замечательно отмечает в комментариях, что связано с тем, о чем я говорил.

Стоит отметить, что это возможно для вызова к сокету UDP бросить SocketException с SocketError.ConnectionReset как код ошибки. UDP не имеет никакого вида сеанса со структурированным подключить / отключить, но он использует динамически назначенный удаленный порт для разрешить ответы, что является своего рода 'Соединение'.

0 голосов
/ 03 мая 2010

После 2 часов попыток по-разному - могут быть случайные решения:

  • Сервер хочет, чтобы вы указали порт, отличный от того, который вы будете использовать для фактической отправки данных. «выделенные розетки»

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

Решение

1- Вы создадите сокет с известной IPEndpoint и отправите на него «стартовое сообщение» ..

2- Затем ждите, чтобы получить с любого IP ...

3- Сервер ответит «приветственное сообщение» с указанием конечной точки, которую он будет использовать (изменив параметр ref remoteEP для Socket.ReceiveFrom ())

4- Затем необходимо изменить порт, на который вы отправляете = порт удаленной конечной точки + 1 (почему? Стандартным способом или чем-то?)

5- Наконец-то вы можете отправлять и получать нормально, используя эти порты

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