当前位置: 首页 > 编程语言 > C#

在C#中对使用UDP协议的套接字感到困惑Share

时间:2023-04-10 15:07:09 C#

在C#中对使用UDP协议的套接字感到困惑,我需要一些帮助。我有一个测试应用程序(Windows窗体)和一个不同的类(实际上是它自己的.dll,但这无关紧要)我有我的套接字代码的所有服务器/客户端代码。问题1)在我的测试应用程序中,在服务器部分,用户可以单击“开始侦听”按钮,我的套接字应用程序的服务器部分应该开始侦听指定地址和端口上的连接,到目前为止一切正常。但是,应用程序被阻止,除非有人连接到服务器,否则我什么也做不了。如果没有人连接怎么办?我应该怎么办?我可以指定接收超时但是什么?抛出异常,怎么办?我想要的是主应用程序上的某种活动,以便用户知道该应用程序不会冻结并等待连接。但如果没有连接,它应该超时并关闭所有内容。也许我应该对发送/接收方法使用异步调用,但它们看起来很混乱,我无法让它工作,只能同步(我将在下面发布我当前的代码)。问题2)当某些发送/接收呼叫超时时,我是否需要关闭任何东西?正如您在我当前的代码中看到的那样,我在套接字上有一堆关闭,但感觉不对。但是当操作超时,我没有关闭socket的时候,也感觉不对。总结我的两个问题....我想要一个不会阻塞的应用程序,以便用户知道服务器正在等待连接(例如,带有一个小字幕动画)。如果一段时间后仍未建立连接,我想关闭所有应该关闭的东西。当建立连接或一段时间后没有连接发生时,我想将结果通知主应用程序。这是我的一些代码,其余类似。Packet类是一个自定义类,代表我的自定义数据单元,它现在只是一堆基于枚举的属性,具有将它们转换为字节并返回属性的方法。开始监听连接的函数如下所示:publicvoidStartListening(stringaddress,intport){try{byte[]bufferBytes=newbyte[32];如果(地址。等于(“0.0.0.0”)){udpSocket。绑定(新IPEndPoint(IPAddress.Any,端口));}else{udpSocket.Bind(newIPEndPoint(IPAddress.Parse(address),port));}remoteEndPoint=newIPEndPoint(IPAddress.Any,0);intnumBytesReceived=udpSocket.ReceiveFrom(bufferBytes,refremoteEndPoint);如果(numBytesReceived==0){udpSocket.Close();返回;数据包syncPacket=newPacket(bufferBytes);如果(syncPacket.PacketType!=PacketType.Control){udpSocket。关闭();返回;}}catch{if(udpSocket!=null){udpSocket.Close();我确定我有一堆不必要的代码,但我是新手,我不知道该怎么做,非常感谢任何修复我的代码以及如何解决上述问题的帮助。编辑:我应该说我的要求是使用UDP并在应用层自己实现这些。您可以将其视为家庭作业,但我没有这样标记,因为代码无关紧要,不会成为我成绩的一部分,而且我的问题(我的问题)是“如何编码”,因为我的socketWord体验是很少,没有教过。但我必须说我现在解决了我的问题我想......我在演示应用程序上使用线程并且它给我带来了一些问题,现在我在协议连接中使用它,它更有意义,我可以轻松更改我的自定义协议类属性并从演示应用程序中读取它们。我已经指定了超时,如果达到超时,则会抛出SocketException。你应该这样做:publicvoidMySimpleServer(stringaddress,intport){try{byte[]bufferBytes=newbyte[32];if(address.Equals("0.0.0.0")){udpSocket.Bind(newIPEndPoint(IPAddress.Any,port));}else{udpSocket.Bind(newIPEndPoint(IPAddress.Parse(address),port));}remoteEndPoint=newIPEndPoint(IPAddress.Any,0);while(serverCanRun){intnumBytesReceived=udpSocket.ReceiveFrom(bufferBytes,refremoteEndPoint);//只是意味着其中一个客户端使用Shutdown关闭了连接。//并不意味着我们不能继续接收。如果(numBytesReceived==0)继续;//此处相同,循环接收来自另一个客户端的信息。数据包syncPacket=newPacket(bufferBytes);如果(syncPacket.PacketType!=PacketType.Control)继续;处理数据包(数据包,端点);}}catch{if(udpSocket!=null){udpSocket.Close();}}}看?只是浪费时间关闭UDP套接字以开始从另一个套接字监听,因为没有连接。同一个套接字可以从所有知道正确端口和地址的udp客户端接收。这就是remoteEndPoint的用途。它告诉客户端发送消息。更新2小更新以总结我的所有评论。