2016-10-13 7 views
0

接続を受け付ける非常に単純なサーバーを作成しようとしています。sockaddr.sin_port = 1337が実際の開かれたポートと一致しません

(UNKNOWN)[127.0.0.1] 1337(?):127.0.0.1:1337に接続しようとすると、

int sock, serv; 
struct sockaddr_in in_sock; 
serv = socket(AF_INET, SOCK_STREAM, 0); 
in_sock.sin_addr.s_addr = 0; 
in_sock.sin_port = 1337; 
in_sock.sin_family = AF_INET; 
bind(serv, (struct sockaddr *)&in_sock, sizeof(in_sock)); 
listen(serv, 0); 
client = accept(serv, 0, 0); 

はしかし、私は、接続はメッセージを拒否し得る接続は

を拒否しました

しかし、単純なnetstat -tcpanポートが実際に開いていることを私に示しています

TCP 0 0 0.0.0.0: 14597 0.0.0.0:* LISTEN

もっと高いポートでsin_portを設定すると、正常に動作するようです。

私はここで何が欠けていますか?なぜ1337港は開かれていないのですか?それは自由であるようにも思われる。

+0

あなたはポートがバイト順を切り替えるために[ 'htons'](https://linux.die.net/man/3/htons)を使用する必要がオーケー –

答えて

3

struct sockaddr_inのポート番号フィールドは、ネットワークバイトオーダーで格納されます。これはそれに値を格納するときにhtons()を使用しなければならないことを意味します

そうでない場合は
in_sock.sin_port = htons(1337); 

、ポート番号はバイトスワップのままになります。これは正確に何がここに起こっているされています

1337 = 0x0539 
14597 = 0x3905 
+0

それは面白いです、私はそれが問題だったかもしれないと思った、私はそれを深く見ていたはずです。ありがとう、それは問題でした。 – user96649

1
listen(serv, 0); 

listenへの2番目の引数は、backlogであり、我々はdocumentation for listenを見れば:

バックログ引数は数sockfdため 保留中の接続のキューが成長するための最大の長さを定義します。キューがいっぱいになったときに接続要求 が到着した場合、クライアントは でECONNREFUSEDと表示されるか、下位プロトコルが 再送信をサポートしている場合は、後で再度接続しようとすると無視されます。

ECONNREFUSEDバックログがいっぱい(0個の接続を保持できるため、常に満杯)というエラーメッセージが表示されます。 その数を1以上に増やす必要がありますが、それ以上の数値を入力すると、より良い数値が表示されますlisten(serv, 10);

+0

しかし、なぜnetstatで示されたポートに接続できますか?したがって、正しいアドレスでポートが開かれ、ECONNREFUSEDが送信されますが、間違ったポートで別のポートが開かれますが、接続できますか? – user96649

関連する問題