当前位置:编程学习 > C#/ASP.NET >>

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楼有点道理。能否 更具体点

引用 4 楼 shiguohui000 的回复:
上面一种是同步执行,它会一直等,直到对方有反应为止,而第二种为异步执行,因此它一下就可以检测到对方主机没开,所以就抛出异常来!
--------------------编程问答--------------------
引用 100 楼 MSDN 的回复:
如果已指定了默认远程主机,则不要使用主机名或 IPEndPoint 调用 Send。如果您进行了调用,UdpClient 将引发异常。

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是不需要连接的。 --------------------编程问答-------------------- 两种情况我独立测试的。。。
没有混在一起
谢谢你的回复
引用 8 楼 hztltgg 的回复:
不太可能是同步异步的问题,不同的重载用完全不同实现不太可能吧

我看msdn有一句话,

如果已经使用 Connect 方法建立了远程主机,请不要将 endPoint 参数提供给此方法。 如果这样做,则 Send 方法将引发 SocketException。 如果收到 SocketException,请使用 SocketException ..::.ErrorCode 获取特定的错误代码。……
--------------------编程问答-------------------- udp_server之前有个udp_server = new UDPClient(LocalPort);
不知道有没有关系
引用 8 楼 hztltgg 的回复:
不太可能是同步异步的问题,不同的重载用完全不同实现不太可能吧

我看msdn有一句话,

如果已经使用 Connect 方法建立了远程主机,请不要将 endPoint 参数提供给此方法。 如果这样做,则 Send 方法将引发 SocketException。 如果收到 SocketException,请使用 SocketException ..::.ErrorCode 获取特定的错误代码。……
--------------------编程问答-------------------- 那就去掉UDPClient的LocalPort试试 --------------------编程问答--------------------
引用 11 楼 lifangjelfson 的回复:
udp_server之前有个udp_server = new UDPClient(LocalPort);

自己好好看看,那个位置的参数不是什么LocalPort,而是Connect所使用的EndPoint。 --------------------编程问答--------------------
引用 13 楼 sp1234 的回复:
引用 11 楼 lifangjelfson 的回复:
udp_server之前有个udp_server = new 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之前不能与其他的终结点绑定。。。
不知道对不对,但是这样做确实不出错了。。。
引用 14 楼 sp1234 的回复:
引用 13 楼 sp1234 的回复:
引用 11 楼 lifangjelfson 的回复:
udp_server之前有个udp_server = new UDPClient(LocalPort);

自己好好看看,那个位置的参数不是什么LocalPort,而是Connect所使用的EndPoint。


哦,sorry,确实是bind到LocalPort。

楼主你写个有5、6……
--------------------编程问答-------------------- 那就是msdn说的,如果已经使用 Connect 方法建立了远程主机,请不要将 endPoint 参数提供给此方法。
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,