差異處
這裏顯示兩個版本的差異處。
python:socket:time_wait_issue [2016/08/18 16:32] tony 建立 |
python:socket:time_wait_issue [2023/06/25 09:48] |
||
---|---|---|---|
行 1: | 行 1: | ||
- | {{tag>python socket}} | ||
- | ====== TIME_WAIT issue after closing the socket ====== | ||
- | ===== Problem ===== | ||
- | <code python> | ||
- | import socket | ||
- | import os | ||
- | import sys | ||
- | def acceptConn(s): | ||
- | while True: | ||
- | conn = None | ||
- | try: | ||
- | conn, addr = s.accept() | ||
- | data = conn.recv(1024) | ||
- | data = data.strip() | ||
- | |||
- | print data | ||
- | if data == 'exit': | ||
- | break | ||
- | except: | ||
- | print sys.exc_info()[0] | ||
- | finally: | ||
- | if conn is not None: | ||
- | conn.close(); | ||
- | conn = None | ||
- | |||
- | s = None | ||
- | try: | ||
- | s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) | ||
- | s.bind(('0.0.0.0', 4444)) | ||
- | s.listen(1) | ||
- | acceptConn(s) | ||
- | finally: | ||
- | if s is not None: | ||
- | s.shutdown(1) | ||
- | s.close() | ||
- | </code> | ||
- | ===== How to? ===== | ||
- | 參考[[https://docs.python.org/2/library/socket.html|python document]],在create socketc後做以下設定: | ||
- | <code python> | ||
- | s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) | ||
- | </code> | ||
- | 這讓kernel知道我們可以重複使用TIME_WAIT的socket。 | ||
- | |||
- | ===== ===== | ||
- | ---- | ||
- | \\ | ||
- | ~~DISQUS~~ | ||
- |