使用Winsock接收数据

使用Winsock接收数据,c,networking,winsock,recv,nonblocking,C,Networking,Winsock,Recv,Nonblocking,现在,我正在为我的在线游戏编程网络,我不是很确定 如何接收数据。 问题是我真的猜不出数据包的大小,所以我想从数据包中只读取4个字节,然后将它们转换成int,以了解数据包的大小。 然后我将创建一个大小相同的缓冲区,并接收数据包的其余部分,这是一个好主意吗 供您参考,我使用的是非阻塞I/o。您的方法听起来很合理-您基本上是将消息大小嵌入到消息头中,这可能是在您的情况下处理它的最可靠的方法。或者,您可以使用固定长度的数据包(ick)或使用某种delimeter字符(这对于二进制消息根本不起作用) 此链

现在,我正在为我的在线游戏编程网络,我不是很确定 如何接收数据。 问题是我真的猜不出数据包的大小,所以我想从数据包中只读取4个字节,然后将它们转换成int,以了解数据包的大小。 然后我将创建一个大小相同的缓冲区,并接收数据包的其余部分,这是一个好主意吗


供您参考,我使用的是非阻塞I/o。

您的方法听起来很合理-您基本上是将消息大小嵌入到消息头中,这可能是在您的情况下处理它的最可靠的方法。或者,您可以使用固定长度的数据包(ick)或使用某种delimeter字符(这对于二进制消息根本不起作用)


此链接包含一些可能有帮助的附加信息

您的方法听起来很合理-您基本上是将消息大小嵌入到消息头中,这可能是在您的情况下处理消息的最稳健的方法。或者,您可以使用固定长度的数据包(ick)或使用某种delimeter字符(这对于二进制消息根本不起作用)


此链接包含一些可能有帮助的附加信息

如果使用TCP套接字,请不要依赖数据包大小。数据流是字节流,而不是数据包流。

如果使用TCP套接字,请不要依赖数据包大小。数据流是一个字节流,而不是一个数据包流。

如果你不小心,你所建议的是一个正在形成的安全漏洞。所以要非常自信,尤其是当你相信网络输入的时候

您没有指定TCP或UDP,所以我只给您一些一般指导

对于TCP或UDP,只需分配一个大小为N的缓冲区,其中N是您可能从远程播放器或服务器发送的最大消息大小。对于UDP,我建议将其保持在1500字节以下。对于TCP,您可以使用更大的尺寸

对于您的套接字,无论是UDP还是TCP,都将其设置为非阻塞。这样,您就不会在等待数据时挂起游戏循环

将大小和crc哈希添加到任何消息的头中。当您以UDP数据包的形式接收消息时,如果数据包头中的大小大于N(这意味着您已经得到一个被截断的数据包),或者哈希值与您在接收大小上计算的值不匹配,只需拒绝该数据包即可。我之所以这样说,是因为没有额外的完整性检查,黑客和骗子会利用您的数据包结构获胜

对于TCP,您基本上按照您描述的方式来构建消息。每条消息都有一个标题,指示要跟随的字节数。但是,请执行与我调用UDP相同的操作—添加您自己的头以进行完整性检查。如果收到消息损坏和断言,请关闭套接字

在TCP中,由于TCP分段,您可能无法在同一个“recv”调用中接收整个消息。也就是说,如果您只收到部分消息,请将其存储在临时缓冲区中。在后续调用recv时(在下一个游戏帧上),附加到此缓冲区。您必须保留变量以跟踪消息的预期结尾,这样您就不会意外地读入可能已发送的下一条消息


祝你好运。

如果你不小心,你提出的建议就是一个正在形成的安全漏洞。所以要非常自信,尤其是当你相信网络输入的时候

您没有指定TCP或UDP,所以我只给您一些一般指导

对于TCP或UDP,只需分配一个大小为N的缓冲区,其中N是您可能从远程播放器或服务器发送的最大消息大小。对于UDP,我建议将其保持在1500字节以下。对于TCP,您可以使用更大的尺寸

对于您的套接字,无论是UDP还是TCP,都将其设置为非阻塞。这样,您就不会在等待数据时挂起游戏循环

将大小和crc哈希添加到任何消息的头中。当您以UDP数据包的形式接收消息时,如果数据包头中的大小大于N(这意味着您已经得到一个被截断的数据包),或者哈希值与您在接收大小上计算的值不匹配,只需拒绝该数据包即可。我之所以这样说,是因为没有额外的完整性检查,黑客和骗子会利用您的数据包结构获胜

对于TCP,您基本上按照您描述的方式来构建消息。每条消息都有一个标题,指示要跟随的字节数。但是,请执行与我调用UDP相同的操作—添加您自己的头以进行完整性检查。如果收到消息损坏和断言,请关闭套接字

在TCP中,由于TCP分段,您可能无法在同一个“recv”调用中接收整个消息。也就是说,如果您只收到部分消息,请将其存储在临时缓冲区中。在后续调用recv时(在下一个游戏帧上),附加到此缓冲区。您必须保留变量以跟踪消息的预期结尾,这样您就不会意外地读入可能已发送的下一条消息


祝你好运。

你使用的是TCP还是UDP?UDP将允许您在消息边界上接收消息,但TCP只允许您传输数据。但是,您可以非常确定您的数据包将小于1500字节,因为这是正常以太网上允许的最大大小。即使您确定您的数据包小于该大小,您如何知道一条消息何时结束,另一条消息何时开始?您需要向协议中添加信息(如消息大小)以确保安全。您使用的是TCP还是UDP?UDP将允许您在消息边界上接收消息,但TCP只允许您传输数据。但是,您可以非常确定您的数据包将小于1500字节,因为这是正常以太网上允许的最大大小。即使您确定您的数据包小于该大小,您如何知道一条消息何时结束,另一条消息何时开始?您需要添加通知