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

Abd*_*lah 5 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");
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,我使用htonlhtons长度超过一个字节的任何类型将其转换为网络字节顺序.在编写数据包之后,我将数据序列化并打包在char数组中,最后将其发送给netowrk.

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

谢谢

Jer*_*fin 3

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

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

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