UdpClient.Send的问题

th362cn 2010-09-06 03:23:00

public partial class UDPSocket : Component
{
private IPEndPoint ServerEndPoint = null; //定义网络端点
private UdpClient UDP_Server = new UdpClient(); //创建网络服务,即UDP的Socket
private Thread thdUdp; //创建线程
public delegate void DataArriveEventHandler(byte[] Data, IPAddress IP, int port); //定义数据到达托管事件
public event DataArriveEventHandler DataArrival; //通过托管,在空间中定义一个事件
private string localHost = "127.0.0.1"; //定义本机地址
[Browsable(true), Category("Local"), Description("本地ip地址")] //在窗口设置本地ip地址
public string LocalHost
{
get { return localHost; }
set { localHost = value; }
}

private int localPort = 11000;
[Browsable(true), Category("Local"), Description("本地端口号")] //在属性窗口显示本地端口号
public int LocalPort
{
get { return localPort; }
set { localPort = value; }
}

private bool active = false;
[Browsable(true), Category("Local"), Description("激活监听")] //在属性窗口显示激活监听属性
public bool Active
{
get { return active; }
set
{
active = value;
if (active)
{
OpenSocket(); //打开监听
}
else
{
CloseSocket(); //关闭监听
}
}
}

public UDPSocket() //构造函数
{
InitializeComponent();
}

public UDPSocket(IContainer container) //构造函数
{
container.Add(this);
InitializeComponent();
}

protected void Listener() //监听
{
ServerEndPoint = new IPEndPoint(IPAddress.Any, localPort); //创建服务器地址
if (UDP_Server != null)
UDP_Server.Close();
UDP_Server = new UdpClient(localPort);//创建新的端口号
UDP_Server.Client.ReceiveBufferSize = 1000000000;//接收缓冲区大小
UDP_Server.Client.SendBufferSize = 1000000000;//发送缓冲区大小

try
{
thdUdp = new Thread(new ThreadStart(GetUDPData));
thdUdp.Start();//执行当前线程
}
catch (Exception e)
{
MessageBox.Show(e.Message);//显示线程错误信息
//throw e;
}
}

private void GetUDPData()//获取当前接收的消息
{
while (active)
{
try
{
byte[] Data = UDP_Server.Receive(ref ServerEndPoint);

if (DataArrival != null)
{
DataArrival(Data, ServerEndPoint.Address, ServerEndPoint.Port);
}
Thread.Sleep(0);
}
catch
{
//throw e;
}
}
}

private void CallBackMethod(IAsyncResult ar)
{
//从异步状态ar.AsyncState中,获取委托对象
DataArriveEventHandler dn = (DataArriveEventHandler)ar.AsyncState;
dn.EndInvoke(ar);
}

public void Send(IPAddress Host, int port, byte[] Data)
{
try
{
IPEndPoint server = new IPEndPoint(Host, port);
int n = Data.Length;
if (UDP_Server != null)
{
UDP_Server.Send(Data, n, server);
}
}
catch (Exception e)
{
MessageBox.Show(e.ToString());
//throw e;
}
}

private void CloseSocket()
{
if (UDP_Server != null)
UDP_Server.Close();
if (thdUdp != null)
{
Thread.Sleep(30);
thdUdp.Abort();
}
}

private void OpenSocket()//打开
{
Listener();
}
}

这是我写的组件,让我郁闷的是,在窗体调用是,每次使用Send方法发送数据的时候都会弹出一个小对话框,显示“未将对象引用设置到对象的实例”,不知哪里出了错误,望各位大哥指点。
...全文
391 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
你在多线程中使用全局变量的时候加锁啊。 不加锁会冲突。你代码不全。。 貌似是UDP_Server出问题了吧。。
小猪猪哦 2013-03-11
  • 打赏
  • 举报
回复
引用 4 楼 sp1234 的回复:
引用 2 楼 的回复: 每次消息都发送成功了,就是会弹出一个对话框“未将对象引用设置到对象的实例”,这个烦人的对话框搞得人很郁闷。 你画蛇添足地胡乱写什么try...catch啊?删掉它你不就能看到是哪一行、哪一个变量出错了嘛!
写try...catch也可以啊,只要取消注释的throw e 就行了。
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

每次消息都发送成功了,就是会弹出一个对话框“未将对象引用设置到对象的实例”,这个烦人的对话框搞得人很郁闷。
[/Quote]

你画蛇添足地胡乱写什么try...catch啊?删掉它你不就能看到是哪一行、哪一个变量出错了嘛!
一根葱的无奈 2012-05-26
  • 打赏
  • 举报
回复
好大的缓冲区,是10亿啊?!
th362cn 2010-09-06
  • 打赏
  • 举报
回复
每次消息都发送成功了,就是会弹出一个对话框“未将对象引用设置到对象的实例”,这个烦人的对话框搞得人很郁闷。
youliny 2010-09-06
  • 打赏
  • 举报
回复
class 没有 new?
传参错误?

110,534

社区成员

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

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

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