5

我有一个使用 Berkley socker API 在 Linux 下使用 C 在 x86 架构上开发的 TCP 服务器。服务器运行良好,没有任何问题。但现在由于某些原因,我必须在具有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");

如您所见,我使用htonlandhtons用于任何比字节长的类型,将其转换为网络字节顺序。组成数据包后,我将数据序列化并打包成char数组,最后将其发送到网络。

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

谢谢

4

2 回答 2

3

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

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

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

于 2012-04-27T21:08:07.143 回答
0

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

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

于 2012-04-27T21:48:05.330 回答