如何 监听,接收 所有UDP端口 数据
1个回答
展开全部
12端口就用12个线程去接收。 但处理都是一样的吧。
所以要有个事件 比如定义一个事件
public delegate void DataArrivalHandler(byte[] data);参数你定,或者(Stream s)之类,也可以是自定一个类(包含其它信息)继承EventArgs写个 (DataEventArgs e)
public event DataArrivalHandler OnDataArrived;
OnDataArrived+=()这里注册相应的方法,如果不同端口的处理不一样,就相应写不同的事件,当然也可以只定义一个方法,方法根据不同的端口处理。
while(true)
{
byte[] data = (获取)
这里获取数据后,直接调用
OnDataArrived(data)/OnDataArrived(stream)/OnDataArrived(new DataEventArgs (data,ip,port)之类,根据你定义的参数来。
}
而注册的方法里的具体实现,用委托异步调用. 方法体里执行
{
namedDelegate.beginEnvoke();
}
这样,数据处理就异步完成了。
避免数据丢失的话,做个保险。 把接收的数据放入定义的缓冲块里。 当接收的数据量到达一定程序后,取出部分处理,再加入新数据。
类似于TCP的的滑动窗口。 麻烦点,但实现了,效果会好的多。
--------------------------
为什么要用ThreadPool? 不便于控制状态。 当你的线程处理的业务非常单一时用它,这种情况需要不需额外的状态信息,比如就像你上面的每次有不同的byte[] data。
直接 new ThreadStart();
所以要有个事件 比如定义一个事件
public delegate void DataArrivalHandler(byte[] data);参数你定,或者(Stream s)之类,也可以是自定一个类(包含其它信息)继承EventArgs写个 (DataEventArgs e)
public event DataArrivalHandler OnDataArrived;
OnDataArrived+=()这里注册相应的方法,如果不同端口的处理不一样,就相应写不同的事件,当然也可以只定义一个方法,方法根据不同的端口处理。
while(true)
{
byte[] data = (获取)
这里获取数据后,直接调用
OnDataArrived(data)/OnDataArrived(stream)/OnDataArrived(new DataEventArgs (data,ip,port)之类,根据你定义的参数来。
}
而注册的方法里的具体实现,用委托异步调用. 方法体里执行
{
namedDelegate.beginEnvoke();
}
这样,数据处理就异步完成了。
避免数据丢失的话,做个保险。 把接收的数据放入定义的缓冲块里。 当接收的数据量到达一定程序后,取出部分处理,再加入新数据。
类似于TCP的的滑动窗口。 麻烦点,但实现了,效果会好的多。
--------------------------
为什么要用ThreadPool? 不便于控制状态。 当你的线程处理的业务非常单一时用它,这种情况需要不需额外的状态信息,比如就像你上面的每次有不同的byte[] data。
直接 new ThreadStart();
Storm代理
2023-07-25 广告
2023-07-25 广告
StormProxies是一家国内优质海外HTTP代理商,拥有一个庞大的IP资源池,覆盖200多个地区,IP数量大且匿名度高。其优点还包括超高并发、稳定高效、技术服务等特点,同时提供HTTP、HTTPS以及SOCKS5协议支持。此外,Sto...
点击进入详情页
本回答由Storm代理提供
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询