C中数据包的读/写处理示例

时间:2009-06-19 13:43:14

标签: c networking sockets packet

我对C有点新,但我已完成了我的作业(一些教程,书籍等),我需要编写一个简单的服务器来处理来自客户端的请求并与数据库进行交互。我已经阅读了Beej的网络编程指南,但我有点不确定如何拼凑并处理来回发送的数据的不同部分。

例如,假设客户端正在发送一些服务器将放在多个字段中的信息。如何拼凑要发送的数据,然后在服务器端将其重新打包?

谢谢,

埃里克

3 个答案:

答案 0 :(得分:4)

如果我理解正确,你会问,“服务器如何理解客户端发送的信息”?

如果这就是您所要求的,答案很简单:提前双方同意每个使用的数据结构都是兼容的。即你决定提前通信协议是什么。

所以,例如,如果我有一个客户端 - 服务器应用程序,客户端连接并可以询问诸如“时间”,“日期”之类的事情,并且可以说“settime”和“setdate”,我需要写我的服务器以这种方式理解这些命令。

显然,在上述情况下,它是微不足道的,因为它只是一个基于文本的协议。但是,假设您正在编写一个将返回信息结构的应用程序,即

struct Person {
    char* name;
    int age;
    int heightInInches;
    // ... other fields ...
};

您可以从服务器/客户端编写整个结构。在这种情况下,有几点需要注意:

  1. 你需要正确地使用hton / ntoh
  2. 您需要确保您的客户端和服务器都能理解相关的结构。
  3. 您可能也可能不必在4B边界上对齐(因为如果不这样做,不同的C编译器可能会做不同的事情,这可能会在客户端和服务器之间烧掉你,或者它可能不会。)
  4. 一般而言,在编写客户端/服务器应用程序时,最重要的是通信协议。

    但是,我不确定这是否能完全回答你的问题。这就是你所追求的,或者你是否正在询问更多关于如何使用send / recv函数?

答案 1 :(得分:3)

首先,您定义数据包的外观 - 将包含哪些信息。确保定义采用体系结构中立格式。这意味着您可以按照不依赖于计算机是big-endian还是little-endian的顺序指定它,也不是依赖于是使用32位long还是使用64位{{ 1}}值。如果内容的长度可变,请确保定义包含告知每个部分的长度所需的信息 - 特别是,每个变量长度部分的前面应该有适当的长度计数。

当您需要打包数据以进行传输时,您将获取原始(机器特定的)值并将它们以适当的格式写入适当位置的缓冲区(想想“字符数组”)。

此缓冲区将通过线路发送到接收器,接收器将其读入另一个缓冲区,然后反转该过程以从缓冲区获取信息到本地变量。

long等函数可以从网络('n')转换为主机('h')格式的'short'(意思是16位)整数,ntohs()从主机'long'(32位整数)转换为网络格式等 -

一本关于网络的好书是史蒂文斯的“UNIX Network Programming, Vol 1, 3rd Edn”。您可以在其网站上找到更多相关信息,包括示例代码。

答案 2 :(得分:0)

如上所述,您需要的是先前商定的通信方式。有一点可以帮助我使用xmls进行交流。

e.g。您需要时间向客户发送时间,然后将其包含在名为time的标签中。 然后在客户端解析它并读取标记值。

最大的好处是,一旦你在客户端有一个解析器,那么即使你必须发送一些新信息,他们也必须就将在客户端解析的标签名称达成一致。

它对我很有帮助,我希望它对你有帮助。