Я пытаюсь написать сервер, который будет взаимодействовать с любым стандартным клиентом, который может устанавливать сокетные соединения (например, клиент telnet)
Он начинался как эхо-сервер, которому, конечно, не нужно было беспокоиться о порядке сетевых байтов.
Я знаком с функциями ntohs, ntohl, htons, htonl. Они были бы хороши сами по себе, если бы я передавал 16- или 32-битные целые числа или если символы в отправляемой строке были кратны 2 или 4 байта.
Я бы хотел создать функцию, которая работает с такими строками, как:
str_ntoh(char* net_str, char* host_str, int len)
{
uint32_t* netp, hostp;
netp = (uint32_t*)&net_str;
for(i=0; i < len/4; i++){
hostp[i] = ntoh(netp[i]);
}
}
Или что-то подобное. Вышеуказанное предполагает, что размер слова 32-битный. Мы не можем быть уверены, что размер слова на отправляющем компьютере не 16-битный или 64-битный, верно?
Для клиентских программ, таких как telnet, они должны использовать hton * перед отправкой и ntoh * после получения данных, правильно?
РЕДАКТИРОВАТЬ: Для людей это дело, потому что 1-символ является байтом, который не имеет значения порядка байтов:
int main(void)
{
uint32_t a = 0x01020304;
char* c = (char*)&a;
printf("%x %x %x %x\n", c[0], c[1], c[2], c[3]);
}
Запустите этот фрагмент кода. Вывод для меня следующий:
$ ./a.out
4 3 2 1
Те, кто на чипсетах PowerPC должны получить '1 2 3 4', но те из нас, кто на чипсете Intel, должны видеть то, что я получил выше.