Объединение TCP и UDP в C # - PullRequest
       6

Объединение TCP и UDP в C #

0 голосов
/ 23 декабря 2011

Так что в идеале я ищу способ объединить TCP и UDP на сервере и управлять обоими этими соединениями в рамках отдельных клиентских потоков.В настоящее время мне интересно, возможно ли принять TCP-соединение и настроить UDP-соединение от него.

Вот мой идеальный вариант:

  1. Клиент подключается по TCP к серверу черезTCPClient.connect ()
  2. Сервер принимает TCP-соединение через TCPListener
  3. , когда сервер принимает TCP-соединение, он также получает IPEndpoint из TCP-соединения

и использует этоначать UDP-коммуникацию с:

serverUDPSocket.BeginReceiveFrom (byteData, 0, 1024, 
               SocketFlags.None, ref (Endpoint)ThatIPEndpointThatIJustMentioned, 
               new AsyncCallback(client.receiveUDP), 
               (Endpoint)ThatIPEndpointThatIJustMentioned);

^, поэтому я столкнулся с небольшой теоретической проблемой.Насколько я понимаю, конечные точки для TCP и UDP будут отформатированы по-разному.Как я могу решить эту проблему?Я хотел бы избежать подключения клиента к UDP в отдельном потоке и последующего объединения этих потоков в одном управляющем классе.

РЕДАКТИРОВАТЬ:

Вот код, который я пытаюсь реализовать:

//Listening for TCP
TcpClient newclient = listenTCP.AcceptTcpClient(); //Accept the client
Client clientr = new Client(newclient); //Create a new Client class to manage the connection
clientr.actionThread = new Thread(clientr.action); //This thread manages the data flow from the client via the TCP stream
clientr.actionThread.Start(clientr);
EndPoint endPoint = newclient.Client.RemoteEndPoint; //so this is the sketchy part. I am trying to get the endpoint from the TCP connection to set up a UDP "connection". I am unsure about the compatibility as UDP and TCP sockets are different.
UDPSocket.BeginReceiveFrom(new byte[1024],0,1024, SocketFlags.None,ref endPoint, new AsyncCallback(clientr.receiveUDP), null); //the AsyncCallBack is like the manager thread for UDP (same as in TCP)
clients.Add(clientr);

Ответы [ 2 ]

0 голосов
/ 25 декабря 2011

Это было связано с отсутствием понимания UDP с моей стороны на уровне кода.

В итоге я настроил другой метод, который я описал, где он будет принимать исходные UDP-пакеты индивидуально, а затем направлять связь (EndPoint + Message) к управляющему клиентскому классу путем сравнения IP-адресов.

0 голосов
/ 23 декабря 2011

Нет проблем при создании двух слушателей в одном приложении, даже если они используют другой протокол.Я полагаю, вы не спрашиваете, можете ли вы сделать это на одном и том же порту (в любом случае, нет смысла это делать).

Однако слушатель потребляет поток, поэтому ему нужен другой поток, если есть графический интерфейс или какой-то процессdo in application (например, вычисления).

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

...