Send()消息包含TCP套接字中的一些字段(C Linux)

时间:2013-05-30 06:44:14

标签: c linux sockets tcp

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

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

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

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

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

所以我的问题是:如何使用某个字段发送消息?我已经知道send 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;

3 个答案:

答案 0 :(得分:1)

你应该自己尝试,它非常有教育意义。但是有一些简短的建议:

  1. 始终将message_ID放在消息中,这样您就可以通过读取前4个字节来识别传入消息。
  2. 在发送端,在char *缓冲区中对结构的字段进行编码,并使用send(fd,buf,mlen,0)发送它,例如,。 (int *)buffer = htonl(hello_msg.message_ID); mlen = mlen + sizeof(hello_msg.message_ID);
  3. 在接收端做反转。 hello_msg.message_ID = ntohl(*(int *)buffer);
  4. 对于其余字段,请在发送/接收缓冲区中记录偏移量。
  5. 编辑对于c语言示例,您可以查看例如https://stackoverflow.com/questions/5759043/sending-message-over-tcp-ip-using-sockets

答案 1 :(得分:1)

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

答案 2 :(得分:-1)

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

例如:

服务器端:

 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));
相关问题