2

BSD ソケットを使用して C で基本的なクライアントとサーバーを作成しました。65535 を超えるポート番号にバインドでき、クライアントはそれに接続できます。ここで何が間違っていますか?

コード:

int port = 999999;
...
serverAddr.sin_port = htons(port);
4

2 に答える 2

2

htons短い整数で動作します。そのため、数値は 16 ビット バージョンに切り捨てられます。この場合、htonl32 ビット整数を取る 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

上位ビットが失われる様子をご覧ください。 イデオネ

于 2012-10-23T07:41:18.673 に答える