[英]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");
正如您所看到的,我使用长度超过一个字节的任何类型的htonl
和htons
将其转换为网络字节顺序。 在编写数据包后,我将数据序列化并打包在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.