2011-12-23 17 views
0

理想的には、私はサーバ上でTCPとUDPを統合し、これらの両方の接続を個々のクライアントスレッドの下で管理する方法を探しています。現在、私はそれがTCP接続を受け入れ、それからUDP通信を設定することが可能かどうか疑問に思っています。ここでC#でTCPとUDPを統合する

は私の理想的なセットアップです:

  1. クライアントが(TCPClient.connectを介してサーバにTCPで接続している)
  2. Serverは、サーバーがTCP接続を受け入れるとき、それはまた、取得TCPListener
  3. を介したTCPコネクションを受け入れますTCPコネクション

からIPEndpointとしてUDPのコミュニケーションツールを開始することを使用しています。

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

^これは私が少し理論的な問題に取り組んでいるところです。私の理解から、TCPとUDPのエンドポイントは異なったフォーマットになります。この問題を解決するにはどうすればよいですか?私は、クライアントが別のスレッドでUDPに接続し、これらのスレッドを単一の管理クラスの下で結合することを避けたいと思います。

EDIT:

ここでは、私が実装しようとしているコードです:

//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

彼らは異なるプロトコルを使用している場合でも、一つのアプリケーションで2人のリスナーを作成するには問題はありません。私はあなたが同じポートでそれを行うことができるかどうかを尋ねていないと思います(とにかくそれをする必要はありません)。

しかし、リスナーはスレッドを消費しているため、GUIやアプリケーションで実行するプロセスがある場合は別のスレッドが必要です(たとえば計算中)。

すべてのスレッドを1つのスレッドで実行する場合は、まず最初のリスナーからメッセージを受信し、次に2番目のスレッドを設定する必要があります。最初のリスナを設定した場合、メッセージを待っているスレッド全体をコンプリートするので、同時に2つのリスナを1つのスレッドにセットアップすることはできません。

+0

私の混乱はIPEndpointの柔軟性の中にあると思います。私はあなたが同じポートでTCPとUDPをセットアップできることを確信しています。そして、それらを一貫性のために同じポートに置いておきたいと思います。 TCPリスナーはスレッドを消費しています。接続を受け入れ、その接続からの情報を使用してUDP上に別の情報を設定したいと思います(ここでは「接続」という言葉はあまり控え目に使用しています)。 –