将应用程序从little-endian移植到big-endian架构

时间:2012-04-27 21:03:12

标签: c network-programming endianness

我有一个在x86架构上开发的TCP服务器,使用berkley socker API在Linux下使用C.服务器运行正常没有任何问题。但是现在由于某些原因,我必须在具有big-endian架构的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数组中,最后将其发送给netowrk。

在我在Big-endian架构上运行服务器之前,我想清除一些事情。在我认为我memcpy数据并打包它,如果我通过网络发送它不应该在big-endian架构上造成任何问题,因为memcpy将执行逐字节数据复制到数组,因此在Big-endian上运行时,字节顺序应该没有任何问题。然而,我想得到你们那些人的意见,因为我仍然是网络编程的初学者,因此我知道的知识比我多得多。无论我是否走在正确的轨道上,请引导我。所有人都非常感激。

由于

2 个答案:

答案 0 :(得分:3)

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

如果没有看到你的其余代码,就不可能说你在任何地方都使用了hton(l | s)。您也可能已经完成了像复制字节的浮点数字节这样的事情,这不一定有效,与字节顺序问题无关。

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

答案 1 :(得分:0)

您是否确保在接收数据时也使用ntoh / ntos?

顺便说一句,你应该简单地使用struct来发送数据;将它重新组装到字符数组中只会占用CPU时间并可能会出错。