ソケットの復習

Python で書いたことはなかったのでやってみる。

import socket

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
# ↑をしないと、サーバ・プロセスを再起動したあと、TIME_WAIT の間ポートが使えない。
sock.bind(("127.0.0.1", 12345))
sock.listen(1)

while True:
    print "Waiting..."
    cli, addr = sock.accept()
    print "Connected from client %s:%s" % addr
    
    while True:
        msg = cli.recv(100) # 100 は上限。これを超えると分割して取得される
        if msg == '': # 切断されると空文字列が返る
            break
        msg = "Received: %s\n" % msg.rstrip()
        print msg,
        cli.sendall(msg)
        
    print "Closed from client"
    cli.close()
sock.close()

これを起動しておいて、telnet localhost 12345 として実験する。

複数の telnet クライアントから同時に接続してみると、2つ目以降も繋がるのだが応答はない。1つ目のクライアントを切断して始めて、二度目の accept() が呼ばれ、応答が行われる。