サーバ側 accept処理

サーバにおけるaccept処理は下記のように動作する。

アプリケーションからのaccept処理要求は、まずsocketレイヤ(sys_accept)でもう一つ空のソケットを作成する

その後即、inet_accept関数を呼び出す(struct proto_ops inet_stream_opsインターフェイステーブル経由)。

  1. inet_accept関数は、まずtcp_accept関数を呼び出す (tcp_protインターフェイステーブル経由)。
    • もしTCP_LISTEN状態のソケットのaccept_queueに TCP_ESTABLISHED状態のソケットが無い場合、 TCP_ESTABLISHED状態のソケット ができるまで待ちに入る(wait_for_connect関数)。
    • ソケットのaccept_queueからTCP_ESTABLISHED状態の ソケットを一つ取り出し、 取得したTCP_ESTABLISHED状態のソケットとリンクされている open_req構造体を解放する(tcp_openreq_fastfree関数)。
  • tcp_accept関数が返却してきたTCP_ESTABLISHED状態の sock構造体とソケットのリンクを行う(sock_graft関数)。

inet_accept関数処理が完了すると、得られたsocketをファイルテーブルに登録する(sock_map_fd関数)。

サーバはaccept処理のよって得られた新しいソケットを通して通信を開始する。


(NIS)HirokazuTakahashi
2000年12月09日 (土) 23時55分06秒 JST
1