
No.2ベストアンサー
- 回答日時:
接続されるサーバ側で考えて見ます。
TCP/IPの仕様として、ザックリと簡単にいえば、一度に使えるポートは1つのみで、
すでに使用されているポートを排他する仕様があります。
たとえばWebサーバを作るとき、すでに別のアプリで80番ポートがリスナとして開かれていると、
そのポートに実際のセッション(接続状態)が無くてもエラーになったりします。
これは、そのポートを先に開いていた接続が閉じた後も待機状態にあるためで、
ただしクライアントが先に閉じると(FIN)、待機状態にはなりません。
この仕様によって、80番を使っている別のサーバを落としたのに、
同じ80番を使おうとしている自身のアプリでポートが開けたり開けなかったりすることが生じます。
しかし接続は閉じているのだから何とかして使いたいですよね。
この待機状態を自身のアプリで利用可能にするための方法があります。
サーバ側のアドレスをソケットにbindする前にSO_REUSEADDRオプションを設定すると、
同じポートを再利用可能にすることができます。
また、OSが提供するAPI上の制約もあります。
サーバ側では、listen (Win32ではプロバイダ側のWSPListen)に指定するバックログというパラメータがあります。
この値はリスニング中に待機させることができるキューのクライアント接続数です。
これを超える数のクライアント接続は失敗します。
Windowsでは仕様上はSOMAXCONN(128)が上限ですが、Windowsのバージョンやエディション、ネットワークドライバの仕様などによっては5以下に制限されることもあり、この値より大きい値は指定できません。
これでは制限がありすぎて使い物にならない、という気がしますね。
しかし、受諾したクライアントのソケットアドレス(アドレスとポート番号のペア)は、
実は二重化(コピー)して使うことができ、元の接続を閉じることができるのです。
このコピーを使用すると、クライアントとの送受信をスレッドとして分離して非同期に行うことができるので、受諾したソケットアドレスはコピーしてスレッドに引き渡したら、元のソケットハンドルを閉じて次のリスンを開始することができ、これによってバックログのサイズはごく小さくすることできます。
これらの手法を使うことによってサーバプロセスでは、
1つしかないポートを複数のプロセスやスレッドで分散し処理するしくみが作れるようになっています。
お役に立てれば幸いです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
リモートデスクトップのアクセ...
-
Hyper-VのMACアドレスについて
-
TortoiseSVNでアクセスエラー
-
Real VNCが頻繁に切断されます
-
接続先のIPを知る方法
-
SSH接続をキー入力の有無でタイ...
-
(SSH)TeraTermでのリモートログ...
-
Windows Serverに対して、sshで...
-
OSX「ネットワーク」に表示され...
-
FFFTPが繋がりません
-
win10での逆デザリングが上手く...
-
ssh接続が定期的に。。。
-
【FTP】ファイル一覧の取得を中...
-
sshのタイムアウト設定
-
AS400データをCSVやテキスト...
-
リモートデスクトップ接続でパ...
-
「DNSサーバーを自動的に取得す...
-
コマンドでのFTP転送が進まない。
-
同じ独自ドメインを2つのサーバ...
-
サーバーというのとメインフレ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
TortoiseSVNでアクセスエラー
-
VirtualBoxのGuestマシンのネッ...
-
AS400データをCSVやテキスト...
-
Real VNCが頻繁に切断されます
-
FTPのアップロートとダウンロー...
-
Tera Term Pro からリモートロ...
-
至急) mac finderの場所 ネット...
-
FFFTP、filezllaに詳しい方教え...
-
【IIS】FTP接続エラーに...
-
接続先のIPを知る方法
-
(SSH)TeraTermでのリモートログ...
-
Macスリープ中にHDDが動いてしまう
-
SFTPで仮想サーバに接続できません
-
WindowsNT(仮想OS)からの印刷
-
Centos6 ある環境からSSH Telne...
-
TeraTerm Domain名を用いてロ...
-
リモートデスクトップのアクセ...
-
FFFTPが繋がりません
-
Hyper-vにて教えてください
-
LinuxPCを社内LANと接続したい
おすすめ情報