理想的には、私はサーバ上でTCPとUDPを統合し、これらの両方の接続を個々のクライアントスレッドの下で管理する方法を探しています。現在、私はそれがTCP接続を受け入れ、それからUDP通信を設定することが可能かどうか疑問に思っています。ここでC#でTCPとUDPを統合する
は私の理想的なセットアップです:
- クライアントが(TCPClient.connectを介してサーバにTCPで接続している)
- Serverは、サーバーがTCP接続を受け入れるとき、それはまた、取得TCPListener
- を介した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);
私の混乱はIPEndpointの柔軟性の中にあると思います。私はあなたが同じポートでTCPとUDPをセットアップできることを確信しています。そして、それらを一貫性のために同じポートに置いておきたいと思います。 TCPリスナーはスレッドを消費しています。接続を受け入れ、その接続からの情報を使用してUDP上に別の情報を設定したいと思います(ここでは「接続」という言葉はあまり控え目に使用しています)。 –