2012-08-27 31 views
5

Tôi đang phát xung quanh bằng Python và nghe các gói UDP trên một cổng nhất định, mọi thứ dường như hoạt động tốt - nhưng sau một khoảng thời gian dài tập lệnh bị lỗi với lỗi sau:Cài đặt lại kết nối của Python bằng peer '

data = self._sock.recv(self._rbufsize) 
socket.error: [Errno 54] Connection reset by peer 

Khi khởi động lại chỉ tập lệnh, cùng một sự cố xảy ra một lần nữa sau một khoảng thời gian ngắn hơn. Khởi động lại máy chủ thay vào đó có vẻ như giải quyết vấn đề hoàn toàn một lần nữa.

đối với các bên ổ cắm điều Với, tôi đang làm:

UDP_IP = "0.0.0.0" 
UDP_PORT = 6000 

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 
sock.bind((UDP_IP, UDP_PORT)) 

Tôi có thiếu một cái gì đó rõ ràng hoặc là chỉ có một cách đơn giản để tránh điều này?

Cảm ơn trước vì bất kỳ ánh sáng nào bạn có thể đổ!

Benji

Trả lời

5

Các lỗi "Connection reset by peer" trên một socket UDP, nghĩa là khách hàng đã nhận được một thông báo lỗi ICMP (ví dụ: cổng unreachable, TTL vượt quá, vv) từ các máy chủ trên một gói nó đã gửi.

Tôi không thể nói chắc chắn những gì đang gây ra điều này trong mã của bạn, nhưng tôi có thể cung cấp hai ý tưởng:

  1. Kết nối đã thực sự bị gián đoạn bởi một cái gì đó (định tuyến vấn đề, phía máy chủ thất bại, vv) . Trong trường hợp này, bạn có thể kiểm tra lỗi này, và nếu và khi nó xảy ra, bạn có thể mở lại ổ cắm của bạn.
  2. Điều gì dường như có thể xảy ra với tôi, nhưng tôi ít quen thuộc hơn, là SO_REUSEADDR đang gây ra sự cố. Tùy chọn ổ cắm này cho phép bạn mở nhiều ổ cắm trên cùng một cổng. có thể xảy ra, là một số quy trình khác đang cố gắng sử dụng cổng 6000, thành công (vì bạn yêu cầu hệ điều hành không chặn nó) và ổ cắm của bạn bị đóng bởi hệ điều hành. Vì tôi không thấy lý do để sử dụng SO_REUSEADDR trên ổ cắm UDP, tôi khuyên bạn nên xóa dòng sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) và thử lại.

Chúc bạn may mắn!

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