У меня есть 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
и, наконец, отправляю их в сеть.
Теперь, прежде чем я запущу свой сервер на архитектуре Big -endian, я хотел прояснить несколько вещей. По моему мнению, поскольку я memcpy
собираю данные и упаковываю их, если я отправляю их по сети, это не должно вызывать никаких проблем с архитектурой с большим -порядком байтов, так как memcpy будет выполнять побайтовое копирование данных в array и, следовательно, не должно быть никаких проблем с порядком байтов при работе с Big -endian. Тем не менее, я хотел узнать мнение о вас, люди, которые, как я полагаю, знают намного больше, чем я, поскольку я все еще новичок в сетевом программировании :). Пожалуйста, помогите мне в этом, на правильном ли я пути или нет. Вся помощь очень ценится.
Спасибо