套接字端口重用

用python編寫socket程序, 在指定端口上監聽服務:

import socket

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
port = 8080
sock.bind(('', port))
sock.listen(1)
print 'listening on port: %s' % port
while True:
    try:
        conn, addr = sock.accept()
        print 'connected by %s:%s' % (addr[0], addr[1])
    except KeyboardInterrupt:
        break
    except socket.error, msg:
        print '%s' % msg

在端口上提供套接字服務,連接之後終止程序運行,再次運行程序時,程序會出現錯誤提示:
...
socket.error: [Errno 48] Address already in use

可以通過設置套接字重用選項SO_REUSEADDR來解決上述問題,如:

import socket

port = 8080
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
server.bind(('', port))
server.listen(1)
print 'listening on port: %s' % port
while True:
    try:
        conn, addr = server.accept()
        print 'connected by %s:%s' % (addr[0], addr[1])
    except KeyboardInterrupt:
        break
    except socket.error, msg:
        print '%s' % msg

提示:
import socket

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

state = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR) # 獲取套接字SO_REUSEADDR選項狀態
print 'state state: %s' % state

sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) #設置套接字選項
state = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
print 'state state: %s' % state

注: 可以使用telnet命令調試

www.pythonfan.org

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章