各 TCP 接続は 4 つのタプル (ターゲット IP アドレス、ターゲット ポート、ソース IP アドレス、ソース ポート) によって定義されるため、どちらのマシンでもポートを「解放」する必要はありません。
サーバー プロセスが新しい接続を開始したfork()
直後に実行されることは非常に一般的です。accept()
親プロセスは、接続記述子 ( によって返されるaccept()
) のコピーを閉じ、新しい接続を待ちます。子プロセスは元のソケット記述子を閉じ、実際の接続を処理する必要のあるプログラムまたはスクリプトを実行します。多くの場合、子プロセスは接続記述子を標準入力と標準出力に ( を使用してdup2()
) 移動するため、実行されたスクリプトまたはプログラムは、リモート クライアントに接続されていることを知る必要さえありません。標準出力に書き込んだものはすべて、リモート クライアントが送信するものはすべて、標準入力から読み取ることができます。
接続を処理する既存のプロセスがあり、2 つのプロセス間に Unix ドメイン ソケット接続 (ストリーム、データグラム、または seqpacket ソケット。違いはありません) がある場合、接続記述子をSCM_RIGHTS
補助メッセージとして転送できます。詳細についてman 2 sendmsg
はman 2 recvmsg
、、、、man 3 cmsg
およびman 7 unix
を参照してください。これは、Unix ドメイン ソケットを介した同じマシン上でのみ機能します。これは、カーネルが実際に記述子を 1 つのプロセスから別のプロセスに複製するためです。実際、カーネルはこれを実現するためにいくつかのファンキーな魔法を行っています。
サーバー側のロジックが次のような場合
- 着信接続ごとに:
- いくつかの計算を行います
- 計算をファイルに保存する
- 接続からの受信データをファイル (または標準出力) に保存します。
を使用することをお勧めしpthreads
ます。必要な数のスレッドを作成accept()
し、リッスンしているソケットを呼び出すことですべてのスレッドが着信接続を待機するようにし、各スレッドが独自に接続を処理するようにします。stdio.h
ファイル I/O に I/O を使用することもできます。pthread_mutex_t
より複雑な出力 (チャンクごとに複数のステートメント) の場合は、出力ストリームごとに必要でありfflush()
、ミューテックスを解放する前にそれを覚えておいてください。SIGINT
これらすべてを実行し、中断された場合 (別名) に正常に終了する単一のマルチスレッド プログラムはCTRL+C
、C で 300 行を超えてはならないのではないかと思います。