【问题标题】:Sample read/write handling of packets in CC 中数据包的示例读/写处理
【发布时间】:2009-06-19 13:43:13
【问题描述】:
我对 C 有点陌生,但我已经完成了我的作业(一些教程、书籍等),我需要编写一个简单的服务器来处理来自客户端的请求并与数据库交互。我已经阅读了 Beej 的网络编程指南,但我有点不确定如何拼凑和处理来回发送的数据的不同部分。
例如,假设客户端正在发送一些信息,服务器将把这些信息放在多个字段中。如何将要发送的数据拼凑起来,然后在服务器端将其分解回来?
谢谢,
埃里克
【问题讨论】:
标签:
c
networking
sockets
packet
【解决方案1】:
如果我理解正确,您是在问“服务器如何理解客户端发送的信息”?
如果您要问的是这个问题,答案很简单:双方事先都同意,双方使用的数据结构将兼容。 IE。您可以提前决定您的通信协议。
因此,例如,如果我有一个客户端-服务器应用程序,其中客户端连接并且可以询问诸如“时间”、“日期”之类的内容,并且可以说“设置时间”和“设置日期”,我需要编写我的服务器以能够理解这些命令的方式。
显然,在上述情况下,它是微不足道的,因为它只是一个基于文本的协议。但是假设您正在编写一个将返回信息结构的应用程序,即
struct Person {
char* name;
int age;
int heightInInches;
// ... other fields ...
};
您可以从服务器/客户端写出整个结构。在这种情况下,有几点需要注意:
- 您需要正确地 hton/ntoh
- 您需要确保您的客户端和服务器都可以理解相关结构。
- 您可能需要也可能不需要在 4B 边界上对齐(因为如果您不这样做,不同的 C 编译器可能会做不同的事情,这可能会在客户端和服务器之间烧毁您,也可能不会)。李>
不过,一般来说,在编写客户端/服务器应用程序时,最重要的是要做好通信协议。
不过,我不确定这是否完全回答了您的问题。这是您所追求的,还是您在询问更多关于您如何使用 send/recv 功能?
【解决方案2】:
首先,您定义数据包的外观——其中包含哪些信息。确保定义采用与架构无关的格式。这意味着您指定它的顺序不取决于机器是大端还是小端,例如,也不取决于您是使用 32 位 long 还是 64 位 long 值进行编译.如果内容是可变长度的,请确保定义包含说明每个部分有多长所需的信息 - 特别是,每个可变长度部分之前应该有一个合适的长度计数。
当您需要打包数据以进行传输时,您将获取原始(特定于机器的)值并将它们以适当的格式写入适当位置的缓冲区(想想“字符数组”)。
这个缓冲区将通过线路发送到接收器,接收器会将其读入另一个缓冲区,然后逆向从缓冲区获取信息到局部变量中。
ntohs() 等函数可以将网络 ('n') 格式转换为主机 ('h') 格式以获取 'short'(表示 16 位)整数,htonl() 可以将host 'long'(32 位整数)到网络格式 - 等等。
史蒂文斯的“UNIX Network Programming, Vol 1, 3rd Edn”是一本关于网络的好书。您可以在其网站上找到有关它的更多信息,包括示例代码。
【解决方案3】:
如上所述,您需要的是事先约定好的沟通方式。对我有帮助的一件事是使用 xmls 进行通信。
例如您需要时间将时间发送给客户端,然后将其包含在名为时间的标记中。
然后在客户端解析它并读取标签值。
最大的优势是,一旦您在客户端安装了解析器,那么即使您必须发送一些新信息,他们也只需就将在客户端解析的标签名称达成一致。
对我有帮助,希望对你也有帮助。