繁体   English   中英

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

[英]Porting an application from little-endian to big-endian architecture

我有一个在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上运行时,字节顺序不应该有任何问题。 然而,我想得到你们那些人的意见,因为我仍然是网络编程的初学者,因此我知道的知识比我多得多。 无论我是否走在正确的轨道上,请引导我。 所有人都非常感谢。

谢谢

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

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

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

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

顺便说一句,你应该简单地使用struct来发送数据; 将它重新组装到字符数组中除了占用CPU时间并且可能承担错误之外什么都不做。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM