1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ソケットプログラミングで学習したことをまとめてみた①(ソケットの作成から接続まで)

Last updated at Posted at 2024-07-05

はじめに

こんにちは。
42tokyoといったところで、コンピュータサイエンス?を学んでいます。
最近、簡単なIRCサーバを実装する課題を通して、ソケットプログラミングについて学びました。
本記事は、ソケットの作成についてまとめています。

間違い等があれば、ご指摘ください。

本記事では、TCP/IP上で行われる通信を想定しています。

本記事における用語について

「ソケットAPI」とは、

  • ソケットに関連するシステムコールの総称
  • ソケットに関連するシステムコールとは、socket()、bind()、listen()、connect()、accept()、send()、recv()など

「ソケット構造体」とは、

  • 本記事において、あるソケット(TCP)に関する諸情報をまとめて「ソケット構造体」と呼ぶ
  • 諸情報とは、以下の通り
    • FIFOバッファ(SendQ, RecvQ)
    • ソケットの状態
    • ローカルipアドレス
    • ローカルポート
    • リモートipアドレス
    • リモートポート
  • 「ソケット構造体」は、socket()によって生成されたディスクリプタでアクセスする
  • 「ソケットAPI」は「ソケット構造体」が持つデータを扱うものと言える

まとめ(全体図)

スクリーンショット 2024-06-19 18.31.35.png

参考

サーバ=クライアント間における接続処理について

サーバ側の動き(socket(); -> bind(); -> listen();まで)

int socket(int domain, int type, int protocol);

  • ソケット構造体が作成される
  • 戻り値のディスクリプタは、この構造体にアクセスできる
  • ソケットの状態は、Closed

int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

  • クライアントが識別可能なローカルポートを設定する
  • クライアントは、ここで設定されたローカルポートを目印に、connect()を実行する

int listen(int sockfd, int backlog);

  • クライアントのconnect()を待ち受ける状態になる
  • ソケットの状態が、Listeningになる

スクリーンショット 2024-06-19 18.33.47.png

クライアント側の動き(socket(); -> connect();まで)

int socket(int domain, int type, int protocol);

  • ソケット構造体が作成される
  • 戻り値のディスクリプタは、この構造体にアクセスできる
  • ソケットの状態は、Closed

int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

  • ソケット構造体の4箇所にそれぞれ値が代入される
  • ローカルポートには、使用されていない値が割り振られる(bind()していないので)
  • サーバとの接続処理が始まり完了すると、ソケットの状態は、Establishedとなる
  • ソケットの状態が、Cnnectedになる

スクリーンショット 2024-06-19 18.35.41.png

サーバ側の動き(accept()まで)

int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);

  • クライアントから接続要求がきたら、新しいソケット構造体を作成する
  • 各フィールドには、パケットから適切な値を取り出し代入する
    • ローカルipアドレス = パケットの送信先ipアドレス
    • ローカルポート  = パケットの送信先ポート(サーバのローカルポートと同じ値)
    • リモートipアドレス = パケットの送信元ipアドレス
    • リモートポート  = パケットの送信元ポート
  • ソケットの状態は、Connecting、not-quite-connected socketsの順番に遷移し、クライアントとの接続処理が完了すると、Establishedとなる

スクリーンショット 2024-06-19 18.36.58.png

さいごに

聞き慣れない用語が沢山あったので、理解に時間が掛かりました。
不備があればお申し付けください。
次回は、recv();, send();について学んだことをまとめていきます。
ありがとうございました。

つづき

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?