Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

B: ソケットのTCP対応

5章ではUDP(データグラム)ソケットを実装しました。これをTCP(ストリーム)ソケットにも対応させ、TCPエコーサーバを作成してください。

目標

  • connect()listen()accept()recv()send()のシステムコールを追加する
  • TCPエコーサーバ(tcpecho)を作成し、ホストからncで接続してエコーが返ることを確認する

ヒント

5章で移植したソケット層(kernel/net/sock.c)は、UDPだけでなくTCP用のコマンド(tcp_cmd_*())への振り分けも最初から備えています。そのため、TCP対応で新しく必要になるのは主にシステムコールの追加だけで、ソケット層やTCPモジュール本体に手を入れる必要はありません。

  • システムコールの追加: 5.3でsocket()/bind()/recvfrom()/sendto()を追加したのと同じ要領で、connect()listen()accept()recv()send()kernel/syssocket.cに実装します。sock_connect()sock_listen()sock_accept()sock_recv()sock_send()を呼び出すだけの薄いラッパーになります。システムコール番号(SYS_*)やプロトタイプ宣言の追加も忘れずに行ってください。
  • accept()の注意点: sock_accept()は接続済みの新しいソケットディスクリプタを返します。これに対してstruct fileとファイルディスクリプタを割り当てて返す必要があります(5.3のsockfdalloc()が使えます)。
  • recv()の注意点: recvfrom()と同様に、実際に受信したバイト数だけをcopyout()してください。

完成イメージ

TCPエコーサーバを起動し、ホストから接続すると、送った内容がそのまま返ってきます。

(xv6側)
$ tcpecho &
waiting for connection on port 7...

(開発環境側)
$ nc 192.0.2.2 7
hello
hello