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