2016-04-19 280 views
1


我试图实现一个小型应用程序(服务器&客户端),它应该通过以太网进行通信。
我为服务器和客户端之间的通信定义了我自己的“协议”。通过套接字接口接收不同的数据类型

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

到目前为止这么好。但现在我将分配接收的数据到一个特定的类型。我定义了不同的结构(每个Payload类型一个)。当结构只包含基元数据类型(整数)时,它可以很好地工作。但是,当我有一个混合类型(整数和char *的消息),我有一些麻烦访问字符串。

一个小例子:在存储器中的接收的有效载荷的样子:

---- 
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 *(指针)和只有字符类型的问题。但我不知道如何才能做到这一点...... 此外,我更喜欢使用接收缓冲区中的数据,而不是复制数据。

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

谢谢!

+1

你没有通过电报发送'char * message'的值,这是发送者本地的内存地址,是吗? – alk

+0

客户端和服务器是否位于同一台机器/同一架构上?如果不是,则发送'int'或其他数字类型的原始字节可能会导致与字节顺序相关的问题([网络字节顺序与小端顺序](https://en.wikipedia.org/wiki/Endianness) )。我喜欢用'struct'来解析,但我认为这个问题在实际应用中可以忽略。 – Myst

回答

1

如果您想使用接收缓冲区中的数据而不进行复制,则一种方法是发送恒定大小的字符串。

typedef struct { 
int error; 
int obj; 
char message[MESSAGE_SIZE]; 
} payload; 
相关问题