c# udpclient 的recv时间问题

assicen 2013-03-11 05:27:46

UdpClient sender = new UdpClient();
--sender.Client.ReceiveTimeout = 0;
--sender.Client.ReceiveTimeout = -1;
--sender.Client.ReceiveTimeout = 1;
sender.Receive(ref remoteEP);


ReceiveTimeout设置为0和-1 貌似会无限等待下去
即使设置为1 我在Receive前后输出时间 耗时也很长 (大概500ms)

有什么办法可以类似c++的recv异步 有没有数据都立即返回 不等待呢?

PS:类似BeginReceive的异步方法不太适合我的需求 就不要提了
...全文
231 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
UdpClient sender = new UdpClient(); if(sender.Available > 0) { sender.Receive(ref remoteEP); }
assicen 2013-03-11
  • 打赏
  • 举报
回复
纠正个笔误 有什么办法可以类似c++的recv非阻塞模式 有没有数据都立即返回 不等待呢?
assicen 2013-03-11
  • 打赏
  • 举报
回复
不要异步 只要立即返回服务端有没有数据回来
gxingmin 2013-03-11
  • 打赏
  • 举报
回复
直接用Socket多好啊,没这个问题
using System;
using System.Threading;
using System.Net;
using System.Net.Sockets;


namespace GDPreAlarm
{
	/// <summary>
	/// clsUdp 的摘要说明。
	/// </summary>
	public class clsUdpSetParam
	{
		private Socket m_udp = null;
	
		private AsyncCallback receiveCallback = null;
		private EndPoint remoteEP = null;
		private byte []buff=null;
		
		public delegate void RecievedDataHandler(EndPoint ep,string strMessage);
		public event RecievedDataHandler RecievedData;

		internal clsUdpSetParam()
		{
			//
			// TODO: 在此处添加构造函数逻辑
			//
			
		}

	/// <summary>
	/// 接收线程
	/// </summary>
	/// <param name="ar"></param>
		internal void OnDataReceived(IAsyncResult ar)
		{
			if(m_udp==null)
				return;
			try
			{
				Socket udpSocket = ar.AsyncState as Socket;
				if(m_udp==null)
					return;

				int bytesRecved = udpSocket.EndReceiveFrom(ar, ref remoteEP);
				lock(this)
				{
					
					string strData=System.Text.Encoding.Default.GetString(buff);
					strData=strData.TrimEnd('\0');
					if(RecievedData!=null)
					{
						RecievedData(remoteEP,strData);
					}
					for(int i=0;i<buff.Length;i++)
					{
						buff[i]=(byte)'\0';
					}
				}
			}
			catch(Exception ex)
			{
							}
			finally
			{
			
				if(m_udp!=null)
				{
					try
					{
						m_udp.BeginReceiveFrom(buff, 0, buff.Length, SocketFlags.None,
							ref remoteEP, receiveCallback, m_udp);

					}
					catch
					{
					}
				}
			}
		}
		public void Init()
		{
			buff=new byte[512];
			IPEndPoint localIpEndPoint = new IPEndPoint(IPAddress.Parse(global.g_ServerToUpload.IP),global.g_ServerToUpload.Port);
			remoteEP = new IPEndPoint(IPAddress.Any, 0);
			if(m_udp!=null)
			{
				m_udp.Close();
				m_udp=null;
			}
			m_udp = new Socket(AddressFamily.InterNetwork,
				SocketType.Dgram, ProtocolType.Udp);

			receiveCallback = new AsyncCallback(OnDataReceived);

			m_udp.Bind(localIpEndPoint);

		}

		public void UnInit()
		{
			if(m_udp!=null)
			{
				m_udp.Close();
				m_udp=null;
			}
		}

		public bool SetParam(string strParam,EndPoint epClient)
		{
			if(m_udp==null)
				return false;

			m_udp.BeginReceiveFrom(buff, 0, buff.Length, SocketFlags.None,
				ref remoteEP, receiveCallback, m_udp);

			if(m_udp!=null)
			{
				m_udp.SendTo(System.Text.Encoding.Default.GetBytes(strParam),epClient);
				return true;
			}

			return false;
		}
		
	}

}

110,539

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧