Pythonでsocketライブラリを書いていてsocket.listen(backlog)
の引数に渡すbacklogが何か分からなかったので調べてみた。
注: タスク管理のBacklogのことではありません。
backlogとは
The backlog argument defines the maximum length to which the queue of pending connections for sockfd may grow.
とある。
つまりbacklogとは、サーバにacceptされていないクライアントからの接続要求を保持しておくキューの最大長である。
検証
$ python3 -V
Python 3.5.1
import socket
if __name__ == '__main__':
host = '127.0.0.1'
port = 60001
backlog = 2
bufsize = 1024
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind((host, port))
sock.listen(backlog)
conn, address = sock.accept()
while True:
byte_msg = conn.recv(bufsize)
str_msg = byte_msg.strip().decode('utf-8')
if str_msg == 'end':
break
conn.send(bytes('{}!\n'.format(str_msg), 'utf-8'))
conn.shutdown()
conn.close()
sock.shutdown()
sock.close()
- 1つ目のtelnet
$ telnet localhost 60001
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
Hey
Hey!
サーバから"!"
を付与された文字列が返ってくる。
- 2つ目、3つ目のtelnet
$ telnet localhost 60001
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
Hey
connectedと表示されてはいるが、反応は返ってこない。
- 4つ目以降のtelnet
$ telnet localhost 60001
Trying 127.0.0.1...
telnet: connect to address 127.0.0.1: Operation timed out
Trying ::1...
telnet: connect to address ::1: Connection refused
telnet: Unable to connect to remote host
Connection refusedになる。
acceptされた接続は1つ、unacceptedな接続が2つキューイングされ、キューにも入らない4つ目の接続要求は拒否されていることがわかる。
参考
https://linuxjm.osdn.jp/html/LDP_man-pages/man2/listen.2.html
http://u-kipedia.hateblo.jp/entry/2015/01/01/001135