2013-10-16 14 views
7

Tôi đang làm việc với một chút Python trông như thế này:Python thư viện socket nghĩ socket là mở khi nó không phải

HOST = '127.0.0.1' 
PORT = 43434 
single = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
try: 
    single.bind((HOST, PORT)) 
except socket.error as e: 
    # Print an error, exit. 

Trong khi nó được hoạt động tốt trong quá khứ, bây giờ chúng tôi nhận được lỗi [Errno 98] Address already in use. Trình xử lý SIGINT đóng kết nối ổ cắm, vì vậy tôi không chắc nó có trạng thái như thế nào, nhưng bây giờ tôi chỉ đang cố sửa nó.

Cả lsofnetstat nói không có gì sử dụng cổng đó là:

[$]> sudo netstat -an | grep 43434 
[$]> sudo lsof -i :43434 

TIME_WAIT được thiết lập đến 60 giây, theo /proc/sys/net/ipv4/tcp_fin_timeout, nhưng lỗi xảy ra thậm chí vài giờ sau khi chạy cuối cùng thành công.

Tôi đã cố gắng (tạm thời) thiết lập REUSEADDR (qua single.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)), nhưng điều đó dường như không có hiệu lực.

Điều gì đang xảy ra? Liệu tôi có thể sử dụng lại cổng này mà không phải khởi động lại máy không?

+1

Bạn có gọi 'setsockopt' trước khi bạn được gọi là' bind'? –

+0

@WaleedKhan Yep; nó đã đi ngay trước 'try'. –

Trả lời

0

Hãy thử điều này:
tcpkill -i eth0 cổng 43434

+0

Chạy tcpkill (trong gói dsniff, btw), chỉ bị treo trên 'tcpkill: nghe trên eth0 [cổng 43434]'. Tôi đã thử chạy nó với '-9', cùng một thứ. –

+0

Tôi cũng đã thử sử dụng 'cxkill', báo cáo không có kết nối trên cổng đó. Và tôi đang cố gắng sử dụng 'cutter', nhưng [có vấn đề] (http://stackoverflow.com/q/11581814/120999) nhận được rằng chạy trên CentOS. –

0

Bạn có thể cố gắng thiết lập SO_REUSEPORT tùy chọn socket. Tuy nhiên, nó chỉ hoạt động nếu socket xung đột cũng có các tùy chọn SO_REUSEPORT được thiết lập trước khi nó bị ràng buộc, vì vậy bạn nên thử sau khi khởi động lại sạch sẽ.

Tuy nhiên, bạn đã nói mã python của mình trông giống như mã bạn đã đăng. Bạn đã thực sự thử một phiên bản rất đơn giản của chương trình của bạn để kiểm tra chỉ ràng buộc?

Bạn cũng có thể cố gắng truy tìm chương trình của mình.

1

Tôi muốn thêm nhận xét nhưng nó sẽ không cho phép tôi làm như vậy. vì vậy tôi phải trả lời theo cách này. Theo kinh nghiệm của tôi, tôi đã phải làm như sau để có được ổ cắm để làm việc với bất kỳ thành công. Tôi đã phải tự đặt thời gian chờ một cách rõ ràng.

Trong mã của bạn trước khi mở ổ cắm, bạn nên đặt mã này nếu bạn đang sử dụng phiên bản python 2.3 hoặc mới hơn. Tôi thường bắt đầu với một thời gian chờ 30 giây và sau đó điều chỉnh nó cho những gì làm việc cho một trang web cụ thể. Khi tôi không sử dụng tham số này tôi nhận được các vấn đề flakey.

socket.setdefaulttimeout(timeout) 

Các vấn đề khác tôi đã thực hiện sau khi mở được bắt một số ngoại lệ sau:

  except socket.gaierror, err: 
       # you might want to handle this 
      except socket.sslerror, err2: 
       # you might want to handle this if doing SSL