有两个线程分别负责发送和接收。
发送使用的方法是C# 中UDPClient中的方法:
public int Send(byte[] dgram, int bytes, IPEndPoint endPoint);
接收使用UDPClient中的方法:
public byte[] Receive(ref IPEndPoint remoteEP);
上面的两个IPEndPoint参数都是传入的一个表示服务器监听地址的EndPoint。
发现程序会周期性地发生这样的异常:
System.Net.Sockets.SocketException (0x80004005): Invalid handle at System.Net.Sockets.Socket.SendTo (System.Byte[] buffer, System.Int32 offset, System.Int32 size, System.Net.Sockets.SocketFlags socketFlags, System.Net.EndPoint remoteEP)
所谓周期性地,就是说一开始是能正常工作的,但是工作一段时间,就会触发一次上面的异常。网上对Invalid Handle的解释挺少的,对0x80004005号异常的解释倒是不少,有的说可能是发送消息的时候,遭到服务器的主动拒绝;有的说可能是发送缓冲区满,等等。
按照这个思路,我们怀疑是不是消息发的太频繁,过一段事件后被防火墙判定为攻击者了,所以给断开连接了。但是查了防火墙记录,并没有发现任何异常。发送缓冲区满也不太可能,每秒也只有几K字节而已。
经过大半天的排查,最终我们发现的原因是,Receive方法的参数用错了。
最初理解的RemoteEP的意思是接收来自哪个对端的数据,所以把用服务器的监听IP和端口构造的EndPoint传进来了。但是实际上,Receive(ref IPEndPoint remoteEP)方法中,remoteEP中会告诉调用者收到数据的对端来自哪里。结果这里把remoteEP给改了,然后再把同一个参数传给SendTo方法的时候,就可能引发上面的异常。
解决方法也很简单,Reveive的参数改成一个临时参数,不要去修改表示服务器监听地址的EndPoint对象就可以了。
java.io.EOFException
at java.io.ObjectInputStream$BlockDataInputStream.peekByte(ObjectInputStream.java:2552)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1297)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:351)
at theqq.server$MyThread.run(server.java:157)
java
.net
.
SocketException
: Unrecognized Windows
Sockets
error: 0: no Inet4Address associated with interface
本文提供了在Win7或Vista系统下解决这个
异常
信息的办法。
注意:兼容每个版本的VueJS(1.x和2.x)
您可能不需要Vue-Cordova
重要提示:你不需要的Vue,科尔多瓦与科尔多瓦或访问科尔多瓦插件使用Vue公司Vue公司从组件。 Vue-Cordova是一个实用程序,可在Vue.cordova下的Vue组件中提供以下插件:
cordova-plugin-camera
cordova-plugin-device
cordova-plugin-geolocation
cordova-plugin-contacts
cordova-plugin-chrome-apps-
sockets
-tcp
cordova-plugin-sms
最终解决方法是
将代码ShowMsg(
socketS
end.RemoteEndPoint + ": 接收文件成功"); 中的
socketS
end.RemoteEndPoint 去掉。具体原因可能是
UDP
下的
socket
不存在这种调用。
经过几天学习,终于解决了再
C#
网络
编程中使用
Socket
类Send和Receive方法开发的客户端和服务端的同步通讯程序;实现了又客户端想服务器
发送
消息的界面程序.主要使用的方法是:
1.
Socket
套接字编程的知识,通过IPAddress定义一个IP地址,IPEndPoint定义一个主机,
Socket
实例套接字对象sock和线程Thread的的成员变量;
2.再调用
socket
的bind绑定
在
UDP
通信过程中, 使用try...catch语句接受数据
时
,总是会出现一个错误:
System
.Net
.
Sockets
.
SocketException
(
0x80004005
): 远程主机强迫关闭了一个现有的连接。
最初的最愚蠢的解决方法就是,在catch语句里不做任何动作,让监听端口函数继续运行。但这并非一个长久之计,后来在网
飞翔的野马马:
Linux链接脚本详解
田园诗人之园:
Linux链接脚本详解
田园诗人之园: