0

系统包括一些客户端和服务器。客户端向服务器发送消息有 3 种类型的消息:

  • 连接设置:用户类型命令行:remote-chat <IP addr server>:: ,客户端和服务器聊天之间将建立一个链接TCP连接。TCP连接建立后,客户端发送连接建立信息,包括一些字段: <port addr server> <IP address client><port addr client>
    • 消息标识符:是一个 32 位整数。对于连接设置消息,此字段等于 0。
    • 字段 客户端 2 的 IP 地址(客户端 1 调用),客户端 2 的端口地址。

服务器收到此消息。然后创建与客户端 2 的连接。

  • 数据交换:用于客户端和服务器之间的数据交换。包括一些字段:
    • 消息标识符:是一个 32 位整数。对于数据交换消息,此字段 = 1
    • 数据长度:一个整数,表示文本消息的长度。
    • 数据文本字段:包含要交换的文本消息。

聊天服务器收到客户端 1 发来的数据后,将文本消息从客户端 1 传输到客户端 2(客户端 2 也使用数据交换消息)。

所以我的问题是:如何发送带有某些字段的消息?我已经知道通过函数 send() 发送字符串。在这里,我必须发送消息连接设置或与某些字段进行数据交换,然后我是否在客户端使用打包然后在服务器端解包?请给我一些解决这个问题的方法?

我认为使用:

typedef struct _ConnectionSetup_Message
{
    int  message_ID;    // 0 ConnectionSetup message
    unsigned int Port;
    unsigned shor IP;
} HELLO_Message;

typedef struct _DataExchange_Message
{
    int  message_Length;
    int  message_ID;    // 1 for DataExchange message
    char *text;
} DataExchange_Message;
4

3 回答 3

1

为您的结构使用序列化。并注意永远不要发送指针,而是完全序列化的数据(字符串)。有关更多信息,请阅读https://stackoverflow.com/a/1654822/2294017使用 Boost 序列化和发送数据结构?. 如果您需要深入研究,http://www.ocoudert.com/blog/2011/07/09/a-practical-guide-to-c-serialization/也很方便。

于 2013-05-30T07:06:30.493 回答
1

你应该自己尝试一下,它很有教育意义。不过,一些简短的建议:

  1. 始终将 message_ID 放在消息的最前面,这样您就可以通过读取前 4 个字节来识别传入的消息。
  2. 在发送端,将结构的字段编码到 char *buffer 中,并使用 send(fd, buf, mlen, 0) 发送,例如。(int *) 缓冲区 = htonl(hello_msg.message_ID); mlen = mlen + sizeof(hello_msg.message_ID);
  3. 在接收端进行反转。hello_msg.message_ID = ntohl(*(int *)buffer);
  4. 对于其余字段,保留发送/接收缓冲区中的偏移量。

编辑对于 c 语言示例,您可以查看例如https://stackoverflow.com/questions/5759043/sending-message-over-tcp-ip-using-sockets

于 2013-05-30T06:56:56.927 回答
-1

也许您可以尝试发送该消息类型的标识符,然后发送带有 sizeof(your_struct) 的 len 的结构,并以相同的方式在另一侧读取它。

举个例子:

服务器端:

 write(socket, &flag, sizeof(flag));
 write(socket, &your_struct, sizeof(DataExchange_Message));

然后在客户端:

read(socket, &flag, sizeof(flag));

//and according to the flag you can do what you want because you know what you are going to receive 
read(socket, &your_struct, sizeof(your_struct));
于 2013-05-30T06:58:46.073 回答