c - 将应用程序从小端架构移植到大端架构

标签 c network-programming endianness

我有一个在 x86 架构上使用 C 在 Linux 下使用 berkley socker API 开发的 TCP 服务器。服务器运行良好,没有任何问题。但现在由于某些原因,我必须在具有 big-endian 架构的 MIPS 架构上运行服务器。

服务器和客户端通过一组预定义的协议(protocol)进行通信。我将举例说明服务器如何向客户端发送简单消息:

struct echo_req req;

  req.header.version = OFP_VERSION;
  req.header.type = OFPT_ECHO_REQUEST;
  req.header.length = htons (sizeof req);
  req.header.xid = htonl(y);
  req.data = htonl (456);

char data[sizeof (req)];
data[0] = req.header.version;
data[1] = req.header.type;
memcpy (data + 2, &req.header.length, 2);
memcpy (data + 4, &req.header.xid, 4);
memcpy (data + 8, &req.data, 4);

  if ((send (sock_fd, &data, sizeof (data), 0) == -1))
    {
      printf ("Error in sending echo request message\n");
      exit (-1);
    }
printf("Echo Request sent!\n");

如您所见,我对任何长度超过一个字节的类型使用 htonlhtons 将其转换为网络字节顺序。组成数据包后,我将数据序列化并打包到 char 数组中,最后将其发送到网络。

现在,在我在 Big-endian 架构上运行我的服务器之前,我想清除一些东西。在我看来,当我 memcpy 数据并将其打包时,如果我通过网络发送它,它不应该在 big-endian 架构上造成任何问题,因为 memcpy 将逐字节复制数据放入数组中,因此在 Big-endian 上运行时字节顺序不应该有任何问题。然而,我想听听你们这些人的意见,我认为我知道的比我多得多,因为我仍然是网络编程的初学者 :)。无论我是否走在正确的轨道上,请指导我。非常感谢所有帮助。

谢谢

最佳答案

是的,memcpy 只是按顺序从源到目标复制字节。

如果没有看到您的其余代码,就不可能说您在所有应该使用的地方都使用了 hton(l|s)。也有可能您已经完成了诸如逐字节复制 float 之类的操作,这不一定有效,与字节序问题无关。

不过,我在您上面发布的代码中没有发现任何明显的问题。

关于c - 将应用程序从小端架构移植到大端架构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10357813/

相关文章:

c - 使用子字符串的转换规则转换字符串

C - 使用 printf 和 scanf 的管道..暂停

C++ - 当尝试在 TCP 客户端上连接到不存在的地址时,程序表现出奇怪的行为

c - 为什么在命令行参数的情况下将命令 char 双指针转换为 char 不起作用?

c - 从二进制文件中读取 4 字节日期(大端)

c - 如果使用已经在主机字节顺序中的整数调用 ntohl() 会发生什么?

控制 double

c - 对于具有预定义值的变量的行为不同

java - 向 DatagramSocket 添加超时-receive()

java - 客户端/服务器 - 如何将协议(protocol)与网络逻辑分开?