我目前使用D来为游戏写一个小的UDP服务器。问题是收到的一些数据包与实际数据包的长度不匹配(通过wireshark查看)。D receiveFrom没有收到完整的数据包
例如,客户端通过网络发送一个110字节的数据包,该数据包显示在wireshark下。但是D码只接收7个字节!没有其他7字节的数据包通过网络从客户端发送。
来自D的7个字节与来自110字节分组的前7个字节匹配。我相信这是套接字库的问题,因为我想不出任何其他可能导致此问题的东西。
问题总是发生在同一点和完全相同的数据包。如果被忽略,问题会继续存在某些数据包。
请注意,在这个项目中的多个文件,所以我包括下面的代码的剪:
this(in Logger logger, string bindInterface = "0.0.0.0", ushort bindPort = 19132) {
this.logger = logger;
socket = new UdpSocket(AddressFamily.INET);
bindAddress = new InternetAddress(bindInterface, bindPort);
}
void bind(uint sendBufferSize = 1024 * 1024, uint recvBufferSize = 1024 * 1024) {
socket.bind(bindAddress);
socket.setOption(SocketOptionLevel.SOCKET, SocketOption.BROADCAST, true);
socket.setOption(SocketOptionLevel.SOCKET, SocketOption.SNDBUF, sendBufferSize);
socket.setOption(SocketOptionLevel.SOCKET, SocketOption.RCVBUF, recvBufferSize);
socket.blocking = false;
}
bool recv(ref Address address, ref byte[] buffer) {
auto length = socket.receiveFrom(buffer, SocketFlags.NONE, address);
if(length > 0) {
buffer.length = length;
debug logger.logDebug(to!string(length) ~ " Packet IN: " ~ to!string(cast(ubyte[]) buffer));
return true;
}
buffer = null;
return false;
}
...
Address a;
byte[] data = new byte[1024 * 1024];
while(max-- > 0 && socket.recv(a, data)) {
handlePacket(a, data);
}
完整的源可以发现here.
任何帮助将不胜感激。
客户是
你能看到正在发送的整个消息的确切内容吗?不是你相信它是什么,而是实际发送了什么内容? – zipzit
这不太可能。 UDP传递完整的消息或没有任何东西。这是UDP做出的唯一保证。所以如果你说的是真的,你的网络基础设施,你的操作系统或者代码编译器中的某些东西是非常糟糕的。 – jgauffin
@zipzit如果你的意思是通过wireshark,是的,整个内容出现。有问题的数据是RakNet协议的二进制握手数据包的一部分。 – jython234