使用C中的套接字处理不同大小的数据包

时间:2010-08-06 00:40:54

标签: c sockets tcp

使用C?

中的TCP套接字发送可以使用不同大小的数据包的野兽方法

我想知道,因为我们正在尝试编写一个多人游戏,需要一个包含多种不同大小的数据包的协议..根据recv文档,我可以获得已经读取了多少字节但是我应该如何设置调度数据包只有当它们充满时?

假设我的数据包带有5个字节的头,其中也包含有效负载的长度。我应该使用循环缓冲区或类似的东西在准备好时调度数据包并保留新的部分吗?

3 个答案:

答案 0 :(得分:1)

您可以为数据包传输设计自定义标头,指定数据包长度,索引信息(如果实现了数据包碎片),并在需要时进行一些散列。

一些粗略的伪代码如下:

recv(socket, headerBuf, headerSize, MSG_WAITALL);
nPacketSize = headerBuf[16];    //sample
nByteRead = 0;

while (nByteRead != nPacketSize)
{
    nByteToRead = nPacketSize - nByteRead;
    nCurRead = recv(socket, someBuf, nByteToRead, MSG_PARTIAL);

    nByteRead += nCurRead;
    Sleep(0);   // Yield processor
}

答案 1 :(得分:1)

创建一个表示数据包标头的静态变量,该变量长度为5个字节。创建一个关联的整数,该整数计算尚未读取这五个字节中的多少个。创建第二个整数,计算已读取“内容”的字节数。将这两个整数归零。创建一个关联的char *指针,最终指向收到的数据包内容。

当数据到达时(例如,select表示如此),读取标题的五个字节。您可能会逐渐收到这些字节,因此您需要第一个整数计数变量。考虑您在此处收到的标题字节。

当你收到标题后,完整性检查它。尺寸值是否可以满足(例如不大于2 ^ 30)?如果是这样,malloc该大小或该大小的缓冲区加上标题。 (如果您希望标题连续,请分配足够的空间,然后memcpy将其放入新缓冲区。)

现在,当数据到达时,将其放在已分配的缓冲区中。考虑您创建的第二个整数中的接收字节数。当您收到标题所要求的所有字节时,请重复上述所有操作。

答案 2 :(得分:0)

TCP是基于流的协议,而不是数据报。这意味着传递给发送的缓冲区的数量和大小与接收的缓冲区之间不一定存在一对一的对应关系。这意味着您需要在TCP之上实现自己的“协议”。

此类协议的示例包括HTTP,其中HTTP消息由两个连续回车符,换行符对描绘。 \r\n\r\n。这种描述的唯一问题是确保模式不会出现在消息正文中,或者确保它被转义。其他协议创建一个标题,其中包含正确识别和读取下一条信息所需的信息。我无法想到一个应用程序可以做到这一点。你甚至可以采用混合方法,将两者结合起来。