在C语言中处理数据包的读写示例

3

我在C语言方面还是新手,但我做了功课(看了一些教程和书籍等)需要编写一个简单的服务器来处理客户端请求并与数据库交互。我已经阅读了Beej's Guide to Network programming,但我有点不确定如何组合和处理发送和接收的数据。

例如,如果客户端发送了一些信息,服务器如何将这些数据组合起来发送,然后在服务器端将其分解成多个字段?

谢谢,

Eric

3个回答

4
如果我理解正确,您的问题是:“服务器如何理解客户端发送的信息”?
如果是这样,答案很简单:双方事先约定数据结构兼容。也就是说,您需要事先确定通信协议。
例如,如果我有一个客户端-服务器应用程序,客户端连接后可以请求“时间”,“日期”,并且可以说“settime”和“setdate”,那么我需要编写我的服务器以便它能够理解这些命令。
显然,在上述情况下,由于只是基于文本的协议,因此很简单。但是,假设您正在编写一个返回信息结构体的应用程序,即:
struct Person {
    char* name;
    int age;
    int heightInInches;
    // ... other fields ...
};

您可以从服务器/客户端完整地编写结构体。在这种情况下,有几件事情需要注意:
  1. 您需要正确执行hton / ntoh
  2. 您需要确保客户端和服务器都能理解相关的结构体。
  3. 您可能需要或者不需要对齐到4B边界(因为如果不这样做,不同的C编译器可能会做出不同的事情,这可能会在客户端和服务器之间造成问题,也可能不会造成问题)。
总的来说,在编写客户端/服务器应用程序时,最重要的是要正确处理通信协议。
不过,我不确定这是否完全回答了您的问题。这是您想要的吗?还是您更想知道如何使用send / recv函数?

3
首先,您需要定义数据包的结构 - 包含哪些信息。确保定义采用与体系结构无关的格式。这意味着您需要指定一个不依赖于机器是大端还是小端或者编译是否使用32位或64位long值的顺序。如果内容长度可变,请确保定义包含告知每个部分长度的信息 - 特别是每个长度可变的部分都应该在前面加上适当的长度计数。
当您需要将数据打包传输时,您将把原始(特定于机器的)值写入到缓冲区(类似于“字符数组”)的适当位置,以适当的格式。
此缓冲区将通过网络发送到接收方,接收方将其读入另一个缓冲区,然后反转此过程以将信息从缓冲区获取到本地变量中。
有一些函数,例如ntohs(),可将网络('n')格式的“short”(表示16位)整数转换为主机('h')格式,而htonl()则可将主机“long”(32位整数)转换为网络格式等。

一本关于网络编程不错的书籍是Stevens的"UNIX Network Programming, Vol 1, 3rd Edn"。你可以在它的网站上找到更多相关信息,包括示例代码。


0

如上所述,您需要的是事先商定的通信方式。有一件事可以帮助我,那就是使用XML进行通信。

例如,如果您需要将时间发送给客户端,则将其包含在名为“time”的标记中。然后在客户端上解析并读取标记值。

最大的优点是,一旦您在客户端上放置了解析器,即使您必须发送一些新信息,他们只需同意在客户端上解析的标记名称即可。

这对我很有帮助,我希望它也能帮助您。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接