6

私はいくつかのネットワークテストを行っており、機能を使用しているだけの2つの小さなCプログラムを備えたLinuxボックス間を接続しています:

connect()

接続後、いくつかの小さな計算が行われ、ローカル ファイルに記録されます。プログラムの 1 つに接続を閉じてから、同じポートで netcat リスナーを実行するように指示します。次に、最初のプログラムが接続を再試行し、netcat に接続します。

ポートを解放しながら初期接続を維持し、そのポートの netcat に接続を渡すことができるかどうか (初期接続が閉じられないように) 誰かがアドバイスできるかどうか疑問に思いました。

4

2 に答える 2

4

各 TCP 接続は 4 つのタプル (ターゲット IP アドレス、ターゲット ポート、ソース IP アドレス、ソース ポート) によって定義されるため、どちらのマシンでもポートを「解放」する必要はありません。

サーバー プロセスが新しい接続を開始したfork()直後に実行されることは非常に一般的です。accept()親プロセスは、接続記述子 ( によって返されるaccept()) のコピーを閉じ、新しい接続を待ちます。子プロセスは元のソケット記述子を閉じ、実際の接続を処理する必要のあるプログラムまたはスクリプトを実行します。多くの場合、子プロセスは接続記述子を標準入力と標準出力に ( を使用してdup2()) 移動するため、実行されたスクリプトまたはプログラムは、リモート クライアントに接続されていることを知る必要さえありません。標準出力に書き込んだものはすべて、リモート クライアントが送信するものはすべて、標準入力から読み取ることができます。

接続を処理する既存のプロセスがあり、2 つのプロセス間に Unix ドメイン ソケット接続 (ストリーム、データグラム、または seqpacket ソケット。違いはありません) がある場合、接続記述子をSCM_RIGHTS補助メッセージとして転送できます。詳細についてman 2 sendmsgman 2 recvmsg、、、、man 3 cmsgおよびman 7 unixを参照してください。これは、Unix ドメイン ソケットを介した同じマシン上でのみ機能します。これは、カーネルが実際に記述子を 1 つのプロセスから別のプロセスに複製するためです。実際、カーネルはこれを実現するためにいくつかのファンキーな魔法を行っています。

サーバー側のロジックが次のような場合

  • 着信接続ごとに:
    1. いくつかの計算を行います
    2. 計算をファイルに保存する
    3. 接続からの受信データをファイル (または標準出力) に保存します。

を使用することをお勧めしpthreadsます。必要な数のスレッドを作成accept()し、リッスンしているソケットを呼び出すことですべてのスレッドが着信接続を待機するようにし、各スレッドが独自に接続を処理するようにします。stdio.hファイル I/O に I/O を使用することもできます。pthread_mutex_tより複雑な出力 (チャンクごとに複数のステートメント) の場合は、出力ストリームごとに必要でありfflush()、ミューテックスを解放する前にそれを覚えておいてください。SIGINTこれらすべてを実行し、中断された場合 (別名) に正常に終了する単一のマルチスレッド プログラムはCTRL+C、C で 300 行を超えてはならないのではないかと思います。

于 2013-09-21T21:56:26.907 に答える