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