2016-04-28 10 views
1

私はTCP/IPプロジェクト(サーバー、および多くのクライアント)で作業しています。私はCで完全にコードを書いた。新しいクライアントがサーバーに接続するたびに、関数accept()がその特定の接続の番号を返すことを確認した。上記のコードでTCP/IPのC接続の値を再割り当て

newton = accept(mysocket, (struct sockaddr *)&dest, &socksize) 

newcon異なるクライアントに対して異なります。クライアントが切断するたびに、切断されたクライアントに割り当てられた接続番号はなくなります。その番号は別のクライアントに割り当てられません。サーバーに多数のユーザーがいる場合、クライアントは大量の接続と切断を行います。その数は(0から大きな数に)増加し続けます。サーバーに何百万人ものクライアントが接続している場合、どうすれば対応できますか?接続番号を再利用できる方法はありますか?

+2

「その番号は別のクライアントに全く割り当てられません。」間違っています。accept()システムコールは、新しい接続に使用可能な最も低いファイル記述子を返します。したがって、fd(数値)はリサイクルされます。 – joop

答えて

4

戻り値がacceptであると誤解しています。これは接続の数ではなく、ソケット記述子です。 (ファイル記述子は、* nixプラットフォームでは整数です)。

以前に割り当てられたソケットの1つが閉じられている場合、同じ番号が再び返される可能性があります。スケーラビリティを維持するために、ソケットが不要になった後に閉じることを確認してください。いずれかの方法。

+1

私はそれが接続の数ではないことを知っています。新しいクライアントがサーバーに接続するたびに、私は新しい価値を得ます。私が得るすべての数は、その数より少ない前の数ではありません。問題は、切断されたクライアントを閉じることではない可能性があります。ありがとうございます – sandesh

-1

受け入れは、ディスクリプタを返します。ディスクリプタを格納して操作できるデータ構造を実装することができます。しかし、それはユースケースと実装、そしてそれらを使って何をやっていくのかによって異なります。

1

テストします。

整数の配列を作成します(例:10000サイズ)。接続を受け入れると、その配列に返されたfd値をプッシュします。最後に、配列をソートして重複を探します。他の人が暗示しているように、重複が表示されるはずです。

+1

良いアイデアをテストします。 – sandesh

0

TCP接続のサーバー側実装は、複数の同時接続をサポートするように設計されています。この動作は、パラメータとしてサーバーソケットで呼び出されるaccept()システムコールを使用して実現されます。新しい接続要求が到着すると、システムはこの新しい接続を処理するための新しいソケットを作成し、このソケット記述子はacceptシステムコールによって返されます。その後、この新しい接続上の通信は、acceptによって返されたこのソケット記述子を使用して処理されます。クライアントとの通信が完了すると、接続は閉じられ、このソケット記述子はシステムに返されます。システムは同じ記述子を再び再利用して、新しいクライアント要求を再度処理できます。

接続が閉じられると、接続がTIME_WAIT状態に移行し、接続状態がTIME_WAITのときにソケットが再使用されないことに注意してください。 TIME_WAIT状態の後にソケットは解放されます。したがって、1つの接続が閉じられていると仮定すると、実際にはTIME_WAIT状態になる可能性があります。これは、 'netstat -anp'コマンドを使用して検証できます。

ソケットディスクリプタはシステムリソースであり、各システムには最大ディスクリプタ数の上限があります。その制限に達すると、システムは新しい接続を受け入れません。したがって、クライアント/サーバシステムが同時TCP接続の数が非常に多くないように実装されている場合、オープンディスクリプタの最大数には限界がありません。クライアント/サーバシステムが多数の永続的な接続を必要とする場合は、オープンディスクリプタの制限が問題になる可能性がありますので、増やす必要があります。

+0

"ソケットディスクリプタはシステムリソースであり、各システムには最大限のオープンディスクリプタ数に上限があります"、可能な接続の最大数はどのようにわかりますか? – sandesh

+0

Linuxでのオープンファイル記述子の最大数のシステム全体の制限は、 "cat/proc/sys/fs/file-max"コマンドを使用して確認できます。この制限は、パラメータfs.file-maxのsysctlコマンドを使用して変更できます。 –

関連する問題