我有一个在 x86 架构上使用 C 在 Linux 下使用 berkley socker API 开发的 TCP 服务器。服务器运行良好,没有任何问题。但现在由于某些原因,我必须在具有 big-endian
架构的 MIPS 架构上运行服务器。
服务器和客户端通过一组预定义的协议(protocol)进行通信。我将举例说明服务器如何向客户端发送简单消息:
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");
如您所见,我对任何长度超过一个字节的类型使用 htonl
和 htons
将其转换为网络字节顺序。组成数据包后,我将数据序列化并打包到 char
数组中,最后将其发送到网络。
现在,在我在 Big-endian 架构上运行我的服务器之前,我想清除一些东西。在我看来,当我 memcpy
数据并将其打包时,如果我通过网络发送它,它不应该在 big-endian 架构上造成任何问题,因为 memcpy 将逐字节复制数据放入数组中,因此在 Big-endian 上运行时字节顺序不应该有任何问题。然而,我想听听你们这些人的意见,我认为我知道的比我多得多,因为我仍然是网络编程的初学者 :)。无论我是否走在正确的轨道上,请指导我。非常感谢所有帮助。
谢谢
最佳答案
是的,memcpy
只是按顺序从源到目标复制字节。
如果没有看到您的其余代码,就不可能说您在所有应该使用的地方都使用了 hton(l|s)。也有可能您已经完成了诸如逐字节复制 float 之类的操作,这不一定有效,与字节序问题无关。
不过,我在您上面发布的代码中没有发现任何明显的问题。
关于c - 将应用程序从小端架构移植到大端架构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10357813/