2012-01-06 3 views
0

Я не совсем уверен, возможен ли следующий сценарий.Издатель подписчика клиента UDP-сервера

Используя только UdpClient или Udp Socket, я хотел бы создать один издатель и несколько клиентских окружений.

Udp-сервер вещает на изолированной машине, через Интернет. Один или несколько подписчиков клиентов или «отписки» по мере необходимости, получая таким образом широковещательную передачу.

Is is? Спасибо.

РЕДАКТИРОВАТЬ: Если это так, может ли разработчик ответить?

EDIT: возможно ли отслеживание подписчиков?

ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ:

Существующий, код клиента:

IPEndPoint IPEP = new IPEndPoint(IPAddress.Parse("EXTERNAL IP"), PORT); 
UdpClient UC = new UdpClient(); 
byte[] REZ; 
while (true) 
{ 
    REZ = UC.Receive(ref IPEP); 
    Console.WriteLine("REC: " + Encoding.ASCII.GetString(REZ)); 
} 

Может сервер быть так просто, как хорошо? Я что-то упустил?

ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ: При использовании реального внешнего IP я получаю следующее сообщение об ошибке: Вы должны вызвать метод Bind перед выполнением этой операции.

+0

Да, это возможно. – Kiril

+0

@ Lirik Забавный. (Я знаю, что я просил, поэтому пропустите его). –

+1

извините, но вы в основном описываете протокол UDP и спрашиваете, возможно ли это :). – Kiril

ответ

1

Ответ по-прежнему «Да, это возможно». В основном, ваш вопрос описывает UDP protocol, все материалы, о которых вы просите, встроены в UDP protocol. В протоколе UDP вы ничего не знаете о подписчиках, если они явно не идентифицируют себя (как часть данных, которые они отправляют). Однако в UDP нет понятия издателя и подписчика, есть только клиенты. Ваши клиенты могут отправлять данные, и они могут получать данные, и каждый клиент, подключенный к каналу, может видеть, что публикуется каждым другим клиентом.

  • Если вы хотите иметь строгого издателя, то вы просто заставляете одного клиента отправлять данные на трубу.
  • Если вы хотите, чтобы у вас был строгий подписчик, вы просто делаете данного клиента получать данные из трубы (как и в вашем примере).

Can the server be that simple as well? Am I missing something?

В UDP не существует технически ни один клиент и сервер, каждый конечной точкой является клиентом. Но ответ (еще раз): Да, сервер может быть так просто, как хорошо:

UdpClient udpClient = new UdpClient("www.contoso.com", 11000); 
Byte[] sendBytes = Encoding.ASCII.GetBytes("Is anybody there"); 
try 
{ 
    udpClient.Send(sendBytes, sendBytes.Length); 
} 
catch (Exception e) 
{ 
    Console.WriteLine(e.ToString()); 
} 

Приведенный выше код был взят непосредственно из документации UdpClient.Send.

+0

Спасибо. Я тоже краснею. Но вопрос в том, могу ли я отправить данные без необходимости знать: «www.contoso.com» и 11000 (ip.port)? Таким образом, я должен отправить сообщение от клиента, чтобы сервер мог ответить. Есть ли способ, которым мой клиент мог только и только слушать? (Может быть, я немного недоукомплектовал его). –

+0

И сервер, * только * отправка (или, необязательно, отправка, только если есть слушатель, на свободные ресурсы). –

+0

Адрес www.contoso.com - это адрес UDP-канала, который отображается всем клиентам. Каждый клиент должен знать об этом канале, иначе они не могут разговаривать друг с другом. Дополнительной отправке мешают две вещи: трудно определить, когда прослушиватель подключен, и это также противоречит вашему первоначальному требованию «анонимности». – Kiril