2009-03-03 37 views
6

Gần đây tôi đã học python và tôi mới bắt đầu chơi với mạng bằng thư viện socket của python. Mọi thứ diễn ra suôn sẻ cho đến gần đây khi kịch bản của tôi chấm dứt mà không đóng kết nối. Lần sau, tôi chạy kịch bản, tôi nhận:Ràng buộc cổng Python

File "./alert_server.py", line 9, in <module> 
    s.bind((HOST, PORT)) 
File "<string>", line 1, in bind 
socket.error: (98, 'Address already in use') 

Vì vậy, có vẻ như một cái gì đó vẫn binded vào cổng, mặc dù kịch bản python không chạy (và tôi đã xác minh này sử dụng $px aux gì. kỳ lạ là sau một phút hoặc lâu hơn, tôi có thể chạy lại tập lệnh trên cùng một cổng và nó sẽ ổn thôi. Có cách nào để ngăn chặn/hủy liên kết cổng khi điều này xảy ra trong tương lai không?

Trả lời

14

Điều bạn muốn phải làm ngay trước bind, làm:

s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 

Lý do bạn thấy hành vi của bạn là hệ điều hành đang đặt trước một cổng cụ thể trong một thời gian sau khi kết nối cuối cùng chấm dứt. Điều này là để nó có thể loại bỏ bất kỳ gói đi lạc nào có thể đi vào sau khi ứng dụng đã kết thúc.

Bằng cách đặt tùy chọn ổ cắm SO_REUSEADDR, bạn đang thông báo cho OS rằng bạn biết bạn đang làm gì và bạn vẫn muốn liên kết với cùng một cổng.

+1

Ngoài ra, bạn có thể muốn gọi tắt máy() và đóng() trên ổ cắm. –

Các vấn đề liên quan