有两个线程分别负责发送和接收。

发送使用的方法是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语句里不做任何动作,让监听端口函数继续运行。但这并非一个长久之计,后来在网 飞翔的野马马: (1) .data section对应的VMA地址是0×08050000, 该section内包含了3个32位全局变量, i、j和k, 分别为1,2,3. (2) .text section内包含由”printf( “j=%d “, j );”程序片段产生的代码. 连接时指定.data section的VMA为0×08050000, 产生的printf指令是将地址为0×08050004处的4字节内容作为一个整数打印出来。 如果.data section的LMA为0×08050000,显然结果是j=2 如果.data section的LMA为0×08050004,显然结果是j=1 这里是写错了还是怎么理解??不应该是1和2吗?怎么是2和1?? Linux链接脚本详解 田园诗人之园: [code=csharp] symbol = expression ; symbol += expression ; symbol -= expression ; symbol *= expression ; symbol /= expression ; symbol <<= expression ; symbol >>= expression ; symbol &= expression ; symbol |= expression ; [/code] Linux链接脚本详解 田园诗人之园: 7.1.3.1、符号赋值语 Simple Assignments You may assign to a symbol using any of the C assignment operators: symbol = expression ; symbol += expression ; symbol -= expression ; symbol *= expression ; symbol /= expression ; symbol <<= expression ; symbol >>= expression ; symbol &= expression ; symbol |= expression ; The first case will define symbol to the value of expression. In the other cases, symbol must already be defined, and the value will be adjusted accordingly.