Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sockets D从未接收完整数据包收到_Sockets_Networking_Udp_D - Fatal编程技术网

Sockets D从未接收完整数据包收到

Sockets D从未接收完整数据包收到,sockets,networking,udp,d,Sockets,Networking,Udp,D,我目前正在使用D为游戏编写一个小型UDP服务器。问题是接收到的某些数据包与实际数据包的长度不匹配(通过wireshark查看) 例如,客户端通过网络发送一个110字节的数据包,显示在wireshark下。但是D代码只接收7个字节!没有其他7字节数据包通过网络从客户端发送 D中的7个字节与110字节数据包中的前7个字节匹配。我认为这是套接字库的问题,因为我想不出任何其他可能导致此问题的原因 问题总是发生在同一点和完全相同的数据包上。如果忽略,则某些数据包的问题仍然存在 请注意,此项目中有多个文件,

我目前正在使用D为游戏编写一个小型UDP服务器。问题是接收到的某些数据包与实际数据包的长度不匹配(通过wireshark查看)

例如,客户端通过网络发送一个110字节的数据包,显示在wireshark下。但是D代码只接收7个字节!没有其他7字节数据包通过网络从客户端发送

D中的7个字节与110字节数据包中的前7个字节匹配。我认为这是套接字库的问题,因为我想不出任何其他可能导致此问题的原因

问题总是发生在同一点和完全相同的数据包上。如果忽略,则某些数据包的问题仍然存在

请注意,此项目中有多个文件,因此我在下面包含了代码片段:

this(在记录器记录器中,字符串bindInterface=“0.0.0.0”,ushort bindPort=19132){
this.logger=记录器;
套接字=新的UdpSocket(AddressFamily.INET);
bindAddress=新的InternetAddress(bindInterface,bindPort);
}
无效绑定(uint sendBufferSize=1024*1024,uint recvBufferSize=1024*1024){
socket.bind(bindAddress);
setOption(SocketOptionLevel.socket,SocketOption.BROADCAST,true);
setOption(SocketOptionLevel.socket、SocketOption.SNDBUF、sendBufferSize);
setOption(SocketOptionLevel.socket、SocketOption.RCVBUF、recvBufferSize);
socket.blocking=false;
}
bool recv(参考地址,参考字节[]缓冲区){
自动长度=socket.receiveFrom(缓冲区,SocketFlags.NONE,地址);
如果(长度>0){
buffer.length=长度;
调试记录器.logDebug(到!字符串(长度)~”数据包,在:“~to!字符串(转换(ubyte[])缓冲区));
返回true;
}
缓冲区=空;
返回false;
}

地址a;
字节[]数据=新字节[1024*1024];
而(最大-->0&&socket.recv(a,数据)){
手袋(a,数据);
}
可以找到完整的源代码

任何帮助都将不胜感激


客户端是

此行存在问题:

bool recv(参考地址地址,参考字节[]缓冲区)
使用
ref
时,您不进行切片,但您确实修改了原始缓冲区,因此,如果前一个数据包的长度为7字节,您将无法再接收超过7字节的数据

因此,您可以更改代码以删除ref和返回长度,而不是普通bool

size\u t recv(参考地址,字节[]缓冲区);
然后:

地址a;
字节[]数据=新字节[1024*1024];
尺寸透镜;
而(最大-->0&(len=socket.recv(a,数据))){
手袋(a,数据[0..len]);
}
但是,由于另一个
ref
功能,这可能不适用于
handlePacket
功能,因此另一个变体是不更改
recv
,而只更改
handlePacket
周围的部分代码

地址a;
字节[]数据=新字节[1024*1024];
尺寸=数据[];
而(最大-->0&&socket.recv(a,arr)){
手袋(a,arr);
arr=数据[];
}

您能看到发送的整个邮件的确切内容吗?不是你认为它是什么,而是实际发送的内容是什么?不太可能。UDP传递完整的消息,否则什么也不传递。这是UDP的唯一保证。因此,如果你说的是真的,那么你的网络基础设施、操作系统或代码编译器中的某些东西已经严重损坏。@zipzit如果你是说通过wireshark,是的,整个内容都会显示出来。所讨论的数据是RakNet协议的二进制握手数据包。@jgauffin我以前在这台计算机上的其他语言中从未遇到过这个问题,这就是为什么我认为这是一个D问题。@jython234我的错。我不喜欢D,但我想知道的是,你是否做了类似于
log.console(value\u about\u to\u be\u sent)的事情
在SENDER程序中,您看到了什么?这与你认为你要发送的内容完全相符吗?我猜你错误地发送了未知(控制)字符?(但这只是一个猜测?)他不能简单地删除ref,因为他需要更新
手袋的
.length
。但一个问题是,在第一次recv调用之后,传递给
receiveFrom
数据
缓冲区太小。可能的解决方案:删除
ref
,但从
recv
返回更新后的切片,并将其用于
handlePacket
。或者保持
recv
未修改,并在
handlePacket
之后将
数据
重置为完整的缓冲区大小@jpf是的,我修改了我的答案以使其更准确。您能否更深入地了解为什么
ref byte[/buffer
只接受7个字节?这对我来说没有任何意义。@MaikKlein当你看的时候,你会发现使用了buf.length。在上面的代码中,他将buf.length更改为最后一个数据包的长度。所以当他接收到大小为7字节的数据包时,在下一次调用中,将只有7字节从套接字读取。