c# udpclient 的recv时间问题 本帖最后由 assicen 于 2013-03-11 17:36:04 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 直接用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; } }} 纠正个笔误 有什么办法可以类似c++的recv非阻塞模式 有没有数据都立即返回 不等待呢? UdpClient sender = new UdpClient();if(sender.Available > 0){ sender.Receive(ref remoteEP);} c#中如何获取实际执行的sql语句? winform出现专案档必须在参考清单中包含.NET Framework组件'WindowsBase,PresentationFramework' savefiledialog 问题 关于刚建立对象就用的问题 .net2003出现问题,老要重启。 數據實體存取 60分求visual studio 2002下载地址 这样用c#开发asp.net应用程序? 求C#中数据加密的源代码?在线急等。 C# WinForm,主子窗体关闭问题 关于 Lock 的问题 快下班了,出了个问题,打开cmd访问网络共享路径 提示"拒绝访问
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;
}
}}
有什么办法可以类似c++的recv非阻塞模式 有没有数据都立即返回 不等待呢?
if(sender.Available > 0)
{
sender.Receive(ref remoteEP);
}