
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で質問しましょう!
似たような質問が見つかりました
- モニター・ディスプレイ 識別番号の決まり方 1 2022/06/14 20:44
- ダイヤルアップ Raspberry Piでアナログモデム経由で音声再生 1 2022/05/20 18:01
- その他(パソコン・周辺機器) Windowsマシン。USBタップの「自動切れ、再接続」がうざい。解決策は? 7 2023/01/25 08:27
- プリンタ・スキャナー キャノンmp490プリンター【エラー番号5400】で【プリンタートラブルが発生しました。電源を入れ直 2 2023/07/24 17:45
- Windows 10 リモートデスクトップ接続 1 2022/07/12 14:30
- ルーター・ネットワーク機器 ひとつのスイッチでルーターの冗長化を複数させたい 1 2023/04/12 22:46
- その他(ソフトウェア) Microsoft Store Guitar Pro購入後の質問 1 2022/08/11 17:15
- カスタマイズ(車) いわゆる「テレビキャンセラー」について・・・・・ 7 2022/11/01 20:57
- デスクトップパソコン 動画編集やフォトショップ、イラストレーターなど、このスペックで問題ないですか? 7 2022/08/19 18:10
- Windows 10 windows11のUSB接続の機器がcomポートに表示されない。 3 2023/04/13 07:51
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
qmailのpop3への接続が遅い
-
sshd error: Bind to port 22 ...
-
FTPのアップロートとダウンロー...
-
TortoiseSVNでアクセスエラー
-
接続先のIPを知る方法
-
ssh2 が走っているサーバに ODB...
-
vsftpd外部公開
-
リモートデスクトップのアクセ...
-
VirtualBoxのGuestマシンのネッ...
-
最近、急にSSHやftpが外...
-
ホストマシンとゲストマシンが...
-
【FTP】ファイル一覧の取得を中...
-
リモートデスクトップ接続でパ...
-
循環参照にならない方法があっ...
-
Solarisでのログ情報ファイル
-
システムイベントのMARKとは何...
-
syslogについて…
-
mailコマンドについて
-
公開鍵方式のsshでパスワード入...
-
”Tortoise SVN” と ”Subversio...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VirtualBoxのGuestマシンのネッ...
-
TortoiseSVNでアクセスエラー
-
Real VNCが頻繁に切断されます
-
FTPのアップロートとダウンロー...
-
AS400データをCSVやテキスト...
-
Macスリープ中にHDDが動いてしまう
-
SSHでリモートログインした時に...
-
WindowsNT(仮想OS)からの印刷
-
至急) mac finderの場所 ネット...
-
Tera Term Pro からリモートロ...
-
FFFTP、filezllaに詳しい方教え...
-
net use接続時のネットワークド...
-
リモートデスクトップのアクセ...
-
当端末に対してpingが通らない
-
初歩的ですいません。
-
Winファイル共有、マシン名では...
-
TeraTerm Domain名を用いてロ...
-
SFTPで仮想サーバに接続できません
-
(SSH)TeraTermでのリモートログ...
-
ネットワーク上にホスト名が同...
おすすめ情報