代码之家  ›  专栏  ›  技术社区  ›  Jack

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

  •  1
  • Jack  · 技术社区  · 15 年前

    我很好奇,因为我们正试图写一个多人游戏,需要一个协议,它有许多不同大小的数据包。。根据recv文件,我可以得到多少字节已被读取,但我应该如何设法调度数据包时,他们是execlty满?

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

    3 回复  |  直到 15 年前
        1
  •  1
  •   Heath Hunnicutt    15 年前

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

    当数据到达时(例如。, select 表示是),读取头的五个字节。您可能会逐渐接收这些字节,因此需要第一个整数计数变量。您在这里收到的头字节的帐户。

    当您完成接收头,健全检查它。尺寸值是否可以满足(例如不大于2^30)?如果是的话, malloc 一个缓冲区的大小或大小加上标题(如果您希望标头是连续的,请分配足够的空间,然后 memcpy 将其放入新缓冲区。)

    现在,当数据到达时,将其放入分配的缓冲区中。在您创建的第二个整数中说明接收到的字节。当你收到了所有的字节头要求,然后重复以上所有。

        2
  •  1
  •   YeenFei    15 年前

    您可以为您的数据包传输设计一个自定义报头,它指定数据包长度、索引信息(如果实现了数据包分段)以及一些哈希(如果需要)。

    一些粗略的伪代码如下:

    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
    }
    
        3
  •  0
  •   torak    15 年前

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

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

    推荐文章