2011-12-23 3 views
0

이상적으로, 저는 서버에서 TCP와 UDP를 통합하고 개별 클라이언트 스레드에서이 두 가지 연결을 관리하는 방법을 찾고 있습니다. 현재, 나는 그것이 TCP 연결을 받아들이고 그것으로부터 UDP 통신을 설정할 수 있는지 궁금합니다. 여기 C#에서 TCP 및 UDP 통합하기

내 이상적인 설정입니다 :

  1. 클라이언트 TCPClient.connect를 통해 서버에 TCP에 연결()
  2. 서버는 서버가 TCP 연결을 허용 할 때
  3. , 그것은 또한 얻을 수 TCPListener를 통해 TCP 연결을 허용

    ,691 : TCP 연결

에서 IPEndPoint로하고 그와 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); 

답변

0

이것은 코드 부분에서 UDP에 대한 이해가 부족했기 때문입니다.

초기 UDP 패킷을 개별적으로 수락 한 다음 IP 주소를 비교하여 관리 클라이언트 클래스로 통신 (EndPoint + Message)을 지정하는 방법을 설명하면서 다른 방법을 설정했습니다.

0

. 나는 당신이 같은 항구에서 그것을 할 수 있는지 묻지 않는다고 가정합니다 (어쨌든 그것을 할 어떤 요지도 없습니다).

그러나 리스너는 스레드를 소비하므로 gui 또는 응용 프로그램에서 수행 할 일부 프로세스가있는 경우 다른 스레드가 필요합니다 (예 : 계산).

하나의 스레드에서 모든 작업을 수행하려면 먼저 첫 번째 수신기에서 메시지를 수신 한 다음 두 번째 수신기에서 메시지를 수신해야합니다. 첫 번째 리스너를 설정하면 전체 스레드가 메시지를 기다리는 데 동의하므로 한 번에 두 개의 리스너를 동시에 설정할 수 없습니다.

+0

내 혼란이 IPEndpoint의 유연성에 있다고 생각합니다. 나는 당신이 동일한 포트에서 TCP와 UDP를 설정할 수 있다는 것을 확신하며, 일관성을 위해서 같은 포트에두기를 원합니다. TCP 수신기는 스레드를 사용하고 있으며, 연결을 허용하고 해당 연결의 정보를 사용하여 UDP에서 다른 정보를 설정하고 싶습니다. (여기서는 "연결"이라는 단어를 매우 조심스럽게 사용합니다). –

관련 문제