我目前使用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