У меня есть TCP-сервер, разработанный на архитектуре x86 с использованием C под Linux с использованием berkley socker API. Сервер работает нормально, без проблем. Но теперь по некоторым причинам мне приходится запускать сервер на архитектуре MIPS, которая имеет архитектуру big-endian
.
Сервер и клиенты взаимодействуют через набор предопределенных протоколов. Приведу пример того, как сервер отправляет клиентам простое сообщение:
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
и, наконец, отправляю их в сеть.
Теперь, прежде чем я запущу свой сервер на архитектуре с обратным порядком байтов, я хотел прояснить несколько вещей. По моему мнению, когда я memcpy
собираю данные и упаковываю их, если я отправляю их по сети, это не должно вызывать проблем с архитектурой с прямым порядком байтов, поскольку memcpy будет выполнять побайтовое копирование данных в массив и, следовательно, там не должно быть проблем с порядком байтов при работе с обратным порядком байтов. Тем не менее, я хотел узнать мнение о вас, люди, которые, как я полагаю, знают намного больше, чем я, поскольку я все еще новичок в сетевом программировании :). Пожалуйста, помогите мне в этом, на правильном ли я пути или нет. Вся помощь очень ценится.
Спасибо
sizeof (echo_req)
одинакова на обеих платформах. - person Robᵩ   schedule 30.04.2012