UDP通信 发送数据问题
我用udp仿了一个聊天程序,在发送时若远程主机没开UDP_server = new UdpClient("172.31.27.79", 11001);
UDP_server.Send(data, data.Length);
这种方式不会出现异常
但是,采用下面这种方式
IPEndPoint server = new IPEndPoint(ip, port);
UDP_server.Send(data, data.Length,serve);
会出现“远程主机强迫关闭一个现有的连接”异常
这两种方式有什么区别呢,udp不是无连接的吗?
不解。
望高人指点。
--------------------编程问答-------------------- 感觉没有区别,不一定是代码问题吧,网络环境有没有变化 --------------------编程问答-------------------- 应该不会的,你看MSDN中这两个方法抛出的异常是一样的!
Send(Byte[], Int32)
Send(Byte[], Int32, IPEndPoint) --------------------编程问答-------------------- 以上两个方法抛出的异常都是:
ArgumentNullException dgram 为 nullNothingnullptrnull 引用(在 Visual Basic 中为 Nothing)。
InvalidOperationException UdpClient 已建立默认远程主机。
ObjectDisposedException UdpClient 被关闭。
SocketException 访问套接字时出错。有关更多信息,请参见备注部分。
--------------------编程问答-------------------- 上面一种是同步执行,它会一直等,直到对方有反应为止,而第二种为异步执行,因此它一下就可以检测到对方主机没开,所以就抛出异常来! --------------------编程问答-------------------- 实践证明,两种方式是有区别的。
4楼有点道理。能否 更具体点
--------------------编程问答--------------------
MSDN的 --------------------编程问答-------------------- 支持一个! --------------------编程问答-------------------- 不太可能是同步异步的问题,不同的重载用完全不同实现不太可能吧
我看msdn有一句话,
如果已经使用 Connect 方法建立了远程主机,请不要将 endPoint 参数提供给此方法。 如果这样做,则 Send 方法将引发 SocketException。 如果收到 SocketException,请使用 SocketException ..::.ErrorCode 获取特定的错误代码。 获取该代码后,可以参考 MSDN 中的 Windows Sockets Version 2 API(Windows 套接字第 2 版 API)错误代码文档以获取有关错误的详细说明。
你上面的代码是不是混在一起测试的,不是独立的?
UDP_server = new UdpClient("172.31.27.79", 11001);
IPEndPoint server = new IPEndPoint(ip, port);
UDP_server.Send(data, data.Length,serve);
这样的话,应该是有两次连接远程主机而出错 --------------------编程问答-------------------- “会出现“远程主机强迫关闭一个现有的连接”异常
”
你搞啥了?
UDP是不需要连接的。 --------------------编程问答-------------------- 两种情况我独立测试的。。。
没有混在一起
谢谢你的回复
--------------------编程问答-------------------- udp_server之前有个udp_server = new UDPClient(LocalPort);
不知道有没有关系
--------------------编程问答-------------------- 那就去掉UDPClient的LocalPort试试 --------------------编程问答--------------------
自己好好看看,那个位置的参数不是什么LocalPort,而是Connect所使用的EndPoint。 --------------------编程问答--------------------
哦,sorry,确实是bind到LocalPort。
楼主你写个有5、6行的完整代码,来复现你的这个bug!可以吗? --------------------编程问答-------------------- IPEndPoint server = new IPEndPoint(ip, port);
UdpClient UDPSend = new UdpClient();
UDPSend.Send(data, data.Length,server);
这么做就没问题了,我觉得应该是在使用 UDPSend.Send(data, data.Length,server);
时,UDPSend之前不能与其他的终结点绑定。。。
不知道对不对,但是这样做确实不出错了。。。
--------------------编程问答-------------------- 那就是msdn说的,如果已经使用 Connect 方法建立了远程主机,请不要将 endPoint 参数提供给此方法。
补充:.NET技术 , C#