Jaki jest przenośny sposób konwersji Byte-Order ciągów w C

Próbuję napisać serwer, który będzie komunikował się z dowolnym standardowym klientem, który może tworzyć połączenia z gniazdem (np. Klient telnet)

Zaczęło się od serwera echa, który oczywiście nie musiał się martwić o porządkowanie bajtów sieciowych.

Znam funkcje ntoh, ntohl, htons, htonl. Byłoby wspaniale, gdybym przesyłał albo 16 lub 32-bitowe inty, albo gdyby znaki w wysyłanym łańcuchu były wielokrotnościami 2 lub 4 bajtów.

Chciałbym utworzyć funkcję, która działa na ciągach znaków, takich jak:

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]);
    }
}

Albo coś podobnego. Powyższa rzecz zakłada, że ​​słowa mają 32 bity. Nie możemy być pewni, że słowa na maszynie wysyłającej nie mają 16 bitów lub 64 bitów?

W przypadku programów klienckich, takich jak telnet, muszą używać hton * przed wysłaniem i ntoh * po otrzymaniu danych, prawda?

EDYCJA: Dla ludzi ta rzecz, ponieważ 1-char jest bajtem, którego endian-ność nie ma znaczenia:

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]);

}

Uruchom ten fragment kodu. Dane wyjściowe dla mnie są następujące:

$ ./a.out
  4 3 2 1

Te na chipsetach PowerPC powinny otrzymać '1 2 3 4', ale te z nas na chipsecie intel powinny zobaczyć to, co otrzymałem w większości.

questionAnswers(4)

yourAnswerToTheQuestion