【问题标题】:Receive different data types over socket interface通过套接字接口接收不同的数据类型
【发布时间】:2016-04-19 16:47:20
【问题描述】:


我正在尝试实现一个应该通过以太网进行通信的小型应用程序(服务器和客户端)。
我为服务器和客户端之间的通信定义了自己的“协议”。

现在我在客户端实现这个协议(用 C 语言编写)时遇到了一些麻烦。 我更喜欢实现一个通用的接收功能。这个函数应该接收一个固定大小的“标题”。在此标头中,定义了“有效负载大小”和“有效负载类型”。我的接收函数分配所需的内存并接收完整的有效负载。

到目前为止一切顺利。但是现在我将接收到的数据分配给特定的类型。我定义了不同的结构(每个有效负载类型一个)。当结构仅包含原始数据类型(整数)时,它运行良好。但是当我有一个混合类型(整数和 char* 用于消息)时,我在访问字符串时遇到了一些麻烦。

一个小例子:内存中接收到的Payload如下:

----
int (e.g. 0x42)
----
int (e.g. 0x42)
----
char (e.g. 'o')
----
char (e.g. 'k')
----
char (e.g. '\0')
----

为此我定义了一个结构:

typedef struct {
int error;
int obj;
char* message;
} payload;

我使用以下演员分配接收数据:

payload* myPL = (payload*) receviedPayload;

转换适用于整数值,但不适用于消息。 我看到 char* (指针)和只有 char 类型的问题。但我不知道我该怎么做这个演员...... 此外,我更喜欢使用接收缓冲区中的数据,而不是复制数据。

有人知道我该怎么做吗?或者是否有人对使用不同有效负载和数据类型实现套接字通信有任何一般想法?

谢谢!

【问题讨论】:

  • 您不会通过网络发送char * message 的值,这是一个发送者本地内存地址,是吗?
  • 客户端和服务器是否在同一台机器/同一架构上?如果不是,则为int 或其他数字类型发送原始字节可能会导致与字节顺序(network byte order vs. little-endian)相关的问题。我喜欢使用structs 进行解析,但我认为对于实际应用程序,这个问题不能忽略。

标签: c sockets types casting


【解决方案1】:

如果你想使用接收缓冲区中的数据,而不需要复制,一种方法是发送一个固定大小的字符串。

typedef struct {
int error;
int obj;
char message[MESSAGE_SIZE];
} payload;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-12
    • 2022-01-01
    • 2012-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多