net-nyan-cat

俺たちがインフラ野郎Aチーム

Python ソケットプログラミングについての備忘

ソケットプログラミングは難しい…。 自分でいろいろコードを書いてて思ったので疑問とか書いておく。
TCP/IPに繋がる大事な部分だからちゃんと調べないといけないよね。
書いたコードは以下。

github.com

pythonにおけるソケットプログラミングでは、

  • socketを作る
    sock = socket.sockeet(socket.AF_INET, socket.SOCK_STREAM)
  • socketをアドレスにbindする
    sock.bind(listen_ip, listen_port)
  • bindされたsocketをlisten状態にする
    sock.listen()
  • socketへの接続を許可(accept)する
    con, addr = sock.accept()

で、conに対してデータをやり取りする、ってのが一般な流れ。
ただ、sock.accept()に関してはちょっと難しい部分が多いように感じる。
python3の公式ドキュメントには、

socket.accept()

接続を受け付けます。
ソケットはアドレスにbind済みで、listen中である必要があります。
戻り値は(conn, address) のペアで、 conn は接続を通じてデータの送受信を行うための 新しい ソケットオブジェクト、 address は接続先でソケットにbindしているアドレスを示します。

accept()で実際にどのような動作をするのか詳しく調べられていない。
受け付けるタイミングっていうのは、いったいいつなんだろう。
LISTENしているポートに接続があった瞬間にaccept()を叩くことで、それが許可されるのか、 それともLISTENしているポートにaccept()を叩いておくことで、接続が許可されるのかわからない。

低水準ネットワークインターフェイスと呼ばれるように、ソケット周りに関してはOS周りのソケットAPIを 呼び出すため、もっとLinuxの知識を深める必要がありそう。