将应用程序从小端转换为大端架构

5

我有一个在x86架构下,使用Linux和伯克利套接字API开发的TCP服务器。该服务器运行良好,没有任何问题。但是由于某些原因,现在我必须在MIPS架构上运行该服务器,该架构具有大端字节序。

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

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数组中,最后将其发送到网络上。
现在,在我在大端架构上运行服务器之前,我想澄清一些事情。在我的理解中,当我使用memcpy复制数据并进行打包时,如果将其发送到网络上,则在大端架构上不应该存在任何问题,因为memcpy将对数据进行逐字节复制到数组中,因此在运行大端架构时字节顺序不应存在任何问题。然而,我想听听你们这些比我更了解网络编程的人的意见,因为我还是一个初学者:)。请指导我是否正确。非常感谢您的帮助。
谢谢

你所做的很好。在将其放入网络之前,请将其转换为网络字节顺序。在取出时反转此过程。没有更多可说的了。 - David Heffernan
我想确认一下memcpy部分。这样可以吗? - Abdullah
我想听听大家的意见。这不是 http://codereview.stackexchange.com 的用途吗? - Robᵩ
附注: 字节序不是唯一的问题。您应该确认在两个平台上 sizeof (echo_req) 的大小是否相同。 - Robᵩ
嗨,罗布,正如我所提到的,服务器和客户端通过一组预定义的协议进行通信,echo_request是协议中定义的许多结构体之一,因此大小在两端始终相同。至于代码审查,那就太难了,因为服务器的总行数超过了10,000行 :/ 如果有人能够全部审查它,我会非常高兴 :) - Abdullah
2个回答

3

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

如果没有看到你的代码的其余部分,就无法确定你是否已经在应该使用hton(l|s)的地方都使用了它。还有可能出现像按字节复制浮点数之类的问题,这不受字节序问题的影响。

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


是的,我已经尽力确保在必要的地方使用了 htonl/htons。只是对 memcpy 有些疑虑,所以想确认一下 :)。非常感谢。 - Abdullah

0
你确定在接收数据时也使用了 ntoh/ntos 吗?
顺便说一下,发送数据时应该直接使用结构体;重新组装成字符数组只会浪费 CPU 时间并可能产生错误。

除非结构体被打包,否则不能直接发送它。复制是为了确保正确打包。话虽如此,大多数编译器都有一种声明结构体为“打包”的方法,使用打包的结构体将导致更简单的代码。 - tomlogic
是的,我已经确保使用了 ntoh/ntos。我打包结构体是因为正如 tomlogic 所提到的,直接发送结构体可能会因为不同编译器对结构体声明的差异而导致问题,特别是在 MIPS 和 ARM 这样的架构中,它们不允许未对齐的内存访问,这个问题甚至会变得更糟。所以在我看来最好还是打包它 :) - Abdullah
@Abdullah - 但是你把包装和数据一起发送了!在你展示的代码中,你发送了sizeof(echo_req)字节,这可能因平台而异。 - Robᵩ

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接