【问题标题】:Berkeley socket communication, send and receive structs伯克利套接字通信,发送和接收结构
【发布时间】:2012-11-05 00:13:07
【问题描述】:

我有一个任务,我要为游戏实现一个得分服务器。游戏完成后,游戏将发送()玩家姓名(char *name)和得分(int score)到服务器进行注册,receive(),服务器将发送回5个最高分。

我们将使用 Berkeley 套接字和 C。在阅读和研究了一些示例后,我只能找到只发送单个变量的示例。

write(sd, "Hello World", 12);

char buf[13];
read(sd, buf, 12);
buf[12] = '\0';

平时做什么?发送每个变量(名称和分数)是单独的 write() 函数,还是创建一个包含两个变量的结构?

阅读Beej's Guide to Network Programming后,我遇到了我必须考虑的字节顺序(大/小-endian)问题,这显示在部分下7.4 序列化 - 如何打包数据,除了在所有示例代码包中它们是浮动的和单个变量之外,还可以,有没有办法打包整个结构?

还有一个7.5 Sone of Data Encapsulation部分,它涉及创建一个描述客户端和服务器如何通信的协议,对我来说这看起来更像一个结构,我不会做,但是没有代码说明原理。


简而言之:我想在服务器和客户端之间建立稳定的通信,在这里我交换的不仅仅是单个变量,

【问题讨论】:

    标签: c struct berkeley-sockets


    【解决方案1】:

    在网络通信中,没有变量或结构的概念。你正在做的是发送一个字节序列。

    所以发送结构体的思路,和发送单个值是一样的:将结构体转换成字节序列(序列化),写入socket,在另一端,将字节序列转换回一个结构(反序列化)。

    所以现在你的问题变成了序列化:如何序列化一个结构?

    这只是序列化结构的各个值的组合。

    什么比较常见

    通常您希望减少网络流量。因此,如果您有所有要预先发送的数据,那么一次发送会比通过单独发送每个名称/分数对来手动分块数据更有效。

    【讨论】:

      猜你喜欢
      • 2015-05-12
      • 2010-11-22
      • 2014-12-09
      • 1970-01-01
      • 2010-11-14
      • 2016-06-06
      • 1970-01-01
      相关资源
      最近更新 更多