理想情况下,我正在寻找一种在服务器上统一TCP和UDP并在各个客户端线程下管理这些连接的方法。目前,我想知道是否可以接受TCP连接并从中设置UDP通信。
这是我理想的设置:
并使用它来开始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 :(得分:0)
在一个应用程序中创建两个侦听器没有问题,即使它们使用不同的协议。我想你不会问你是否可以在同一个端口上进行(无论如何都没有意义)。
但是,如果在应用程序中存在gui或某些进程(例如同时进行计算),则侦听器正在使用线程,因此需要使用不同的线程。
如果您想在一个线程中执行所有操作,则必须先从第一个侦听器接收消息,然后再设置第二个消息。不可能同时在一个线程中设置2个侦听器,因为如果你设置了第一个侦听器,它将整个线程等待消息。
答案 1 :(得分:0)
这是因为我从代码级别对UDP缺乏了解。
我最终设置了我描述的另一种方法,即单独接受初始UDP数据包,然后通过比较IP地址将通信(EndPoint + Message)指向管理客户端类。