ソケット接続を確立できる標準クライアント (telnet クライアントなど) と通信するサーバーを作成しようとしています。
もちろん、ネットワークのバイト順を気にする必要はありませんでした。
ntohs、ntohl、htons、htonl 関数に精通しています。16 ビットまたは 32 ビットの int を転送する場合、または送信される文字列の文字が 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]);
}
}
または似たようなもの。上記は、wordsize が 32 ビットであることを前提としています。送信側マシンのワードサイズが 16 ビットでないか、64 ビットでないかはわかりません。
telnet などのクライアント プログラムの場合、データを送信する前に hton* を使用し、データを受信した後に ntoh* を使用する必要がありますね。
編集: 1-char はエンディアンネスが重要ではないバイトであるため、そのことを人々に伝えます:
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 チップセットのユーザーは、ほとんどの場合、上記の結果を確認する必要があります。