BSD ソケットを使用して C で基本的なクライアントとサーバーを作成しました。65535 を超えるポート番号にバインドでき、クライアントはそれに接続できます。ここで何が間違っていますか?
コード:
int port = 999999;
...
serverAddr.sin_port = htons(port);
htons
短い整数で動作します。そのため、数値は 16 ビット バージョンに切り捨てられます。この場合、htonl
32 ビット整数を取る which を使用する必要があります。しかし、それもうまくいきません。はnetinet/in.h
sockaddr_in
次のように定義されます。
struct sockaddr_in
{
__SOCKADDR_COMMON (sin_);
in_port_t sin_port; /* Port number. */
....
};
そしてin_port_t
、次のように定義されます
/* Type to represent a port. */
typedef uint16_t in_port_t;
したがってsin_port
、 は16 ビット整数です。ここでも切り捨てが行われます。したがって、次のコードを実行すると、
int main(){
unsigned long l = 0x00010001;
unsigned short s = 0x00;
printf("l=0x%08lX\n", l);
printf("s=0x%08X\n", s=l);
printf("l=0x%08lX\n", l=s);
return 0;
}
出力は
l=0x00010001
s=0x00000001
l=0x00000001
上位ビットが失われる様子をご覧ください。 イデオネ