因为要写一个网络程序要用到UDP协议,UDP这东西比较麻烦,又不像TCP一样提供可靠的连接,发送接收的超时实在不好设计,最后只要用Timer来检测有没有想要的数据包-_#,不过这不是这次的重点,重点是怎么建立一种高效的UDP机制来实时接收服务器发送过来的数据包.
CodeProject上有个例子是开个线程去同步接收,这样倒是可以满足我的程序需求,不过实际中遇到几个问题:
![[转].Net高效UDP异步编程 [转].Net高效UDP异步编程](/default/index/img?u=L2RlZmF1bHQvaW5kZXgvaW1nP3U9TDBsdFlXZGxjeTlQZFhSc2FXNXBibWRKYm1ScFkyRjBiM0p6TDA1dmJtVXVaMmxt)
1.程序开销大,内存狂飙,接一次数据就要重新开一次线程
![[转].Net高效UDP异步编程 [转].Net高效UDP异步编程](/default/index/img?u=L2RlZmF1bHQvaW5kZXgvaW1nP3U9TDBsdFlXZGxjeTlQZFhSc2FXNXBibWRKYm1ScFkyRjBiM0p6TDA1dmJtVXVaMmxt)
2.由于主界面和底层是完全隔离只是通过中间的接口来通讯,导致线程总是不能正常的结束,程序结束后还有一个进程在那里不知道干什么.
![[转].Net高效UDP异步编程 [转].Net高效UDP异步编程](/default/index/img?u=L2RlZmF1bHQvaW5kZXgvaW1nP3U9TDBsdFlXZGxjeTlQZFhSc2FXNXBibWRKYm1ScFkyRjBiM0p6TDA1dmJtVXVaMmxt)
于是翻阅MSDN,查找自己以前写的代码,最后还是决定用异步来接收,MSDN上UDP异步的例子不太好,有点敷衍的意思,用异步很好的解决了以上的问题,高效完成效率,代码如下:
![[转].Net高效UDP异步编程 [转].Net高效UDP异步编程](/default/index/img?u=L2RlZmF1bHQvaW5kZXgvaW1nP3U9TDBsdFlXZGxjeTlQZFhSc2FXNXBibWRKYm1ScFkyRjBiM0p6TDA1dmJtVXVaMmxt)
![[转].Net高效UDP异步编程 [转].Net高效UDP异步编程](/default/index/img?u=L2RlZmF1bHQvaW5kZXgvaW1nP3U9TDBsdFlXZGxjeTlQZFhSc2FXNXBibWRKYm1ScFkyRjBiM0p6TDA1dmJtVXVaMmxt)
UdpClient qq_client; //Udp客户端
qq_client = new UdpClient();
IPEndPoint remoteQQEP = new IPEndPoint(remotehost, remoteport);
qq_client.Connect(remoteQQEP);
![[转].Net高效UDP异步编程 [转].Net高效UDP异步编程](/default/index/img?u=L2RlZmF1bHQvaW5kZXgvaW1nP3U9TDBsdFlXZGxjeTlQZFhSc2FXNXBibWRKYm1ScFkyRjBiM0p6TDA1dmJtVXVaMmxt)
![[转].Net高效UDP异步编程 [转].Net高效UDP异步编程](/default/index/img?u=L2RlZmF1bHQvaW5kZXgvaW1nP3U9TDBsdFlXZGxjeTlQZFhSc2FXNXBibWRKYm1ScFkyRjBiM0p6TDA1dmJtVXVaMmxt)
AsyncCallback GetRecvBuffer = new AsyncCallback(ReceiveCallback);
qq_client.BeginReceive(GetRecvBuffer, null);
这里用一个GetRecvBuffer的回掉来实现异步
![[转].Net高效UDP异步编程 [转].Net高效UDP异步编程](/default/index/img?u=L2RlZmF1bHQvaW5kZXgvaW1nP3U9TDBsdFlXZGxjeTlQZFhSc2FXNXBibWRKYm1ScFkyRjBiM0p6TDA1dmJtVXVaMmxt)
![[转].Net高效UDP异步编程 [转].Net高效UDP异步编程](/default/index/img?u=L2RlZmF1bHQvaW5kZXgvaW1nP3U9TDBsdFlXZGxjeTlQZFhSc2FXNXBibWRKYm1ScFkyRjBiM0p6TDA1dmJtVXVaMmxt)
private void ReceiveCallback(IAsyncResult ar)
原文地址:
http://blog.csdn.net/fsc2988877/archive/2007/08/19/1750678.aspx
相关文章:
-
2022-02-01
-
2021-12-12
-
2021-10-13
-
2021-11-04
-
2021-12-18
-
2022-12-23
猜你喜欢
-
2022-03-08
-
2022-12-23
-
2022-12-23
-
2022-12-23
-
2021-07-04
-
2021-06-29
-
2021-10-25
相关资源
-
下载
2023-02-01
-
下载
2021-06-05
-
下载
2021-06-05
-
下载
2021-06-06