我有一个在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上运行时,字节顺序应该没有任何问题。然而,我想得到你们那些人的意见,因为我仍然是网络编程的初学者,因此我知道的知识比我多得多。无论我是否走在正确的轨道上,请引导我。所有人都非常感激。
由于
答案 0 :(得分:3)
是的,memcpy
只是按照从源到目的地的顺序复制字节。
如果没有看到你的其余代码,就不可能说你在任何地方都使用了hton(l | s)。您也可能已经完成了像复制字节的浮点数字节这样的事情,这不一定有效,与字节顺序问题无关。
我在上面发布的代码中没有看到任何明显的问题。
答案 1 :(得分:0)
您是否确保在接收数据时也使用ntoh / ntos?
顺便说一句,你应该简单地使用struct来发送数据;将它重新组装到字符数组中只会占用CPU时间并可能会出错。