Tôi gặp vấn đề với một thứ gì đó và tôi đoán đó là mã.Ổ cắm UDP Python bán ngẫu nhiên không nhận được
Ứng dụng được sử dụng để 'ping' một số thiết bị mạng tùy chỉnh được thực hiện để kiểm tra xem chúng có còn sống không. Nó ping chúng mỗi 20 giây với một gói UDP đặc biệt và mong đợi một phản hồi. Nếu họ không trả lời 3 lần ping liên tiếp, ứng dụng sẽ gửi một thông điệp cảnh báo tới nhân viên.
Ứng dụng đang chạy 24/7 và một số lần ngẫu nhiên mỗi ngày (2-5 chủ yếu) ứng dụng không nhận được gói UDP trong thời gian chính xác là 10 phút, sau đó mọi thứ trở lại bình thường. Trong 10 phút đó chỉ có 1 thiết bị dường như đang trả lời, những người khác dường như đã chết. Điều đó tôi đã có thể suy ra từ nhật ký.
Tôi đã sử dụng wireshark để đánh cắp các gói và tôi đã xác minh rằng các gói ping đang chuyển sang AND out, vì vậy phần mạng dường như hoạt động tốt, tất cả các cách tới hệ điều hành. Các máy tính đang chạy WinXPPro và một số không có tường lửa cấu hình nào. Tôi gặp sự cố này trên các máy tính khác nhau, các cài đặt cửa sổ khác nhau và các mạng khác nhau.
Tôi thực sự đang thua lỗ về những gì có thể là vấn đề ở đây.
Tôi đang đính kèm phần có liên quan của mã thực hiện tất cả mạng. Điều này được chạy trong một chuỗi riêng biệt từ phần còn lại của ứng dụng.
Tôi cảm ơn bạn trước vì bất kỳ thông tin chi tiết nào bạn có thể cung cấp.
def monitor(self):
checkTimer = time()
while self.running:
read, write, error = select.select([self.commSocket],[self.commSocket],[],0)
if self.commSocket in read:
try:
data, addr = self.commSocket.recvfrom(1024)
self.processInput(data, addr)
except:
pass
if time() - checkTimer > 20: # every 20 seconds
checkTimer = time()
if self.commSocket in write:
for rtc in self.rtcList:
try:
addr = (rtc, 7) # port 7 is the echo port
self.commSocket.sendto('ping',addr)
if not self.rtcCheckins[rtc][0]: # if last check was a failure
self.rtcCheckins[rtc][1] += 1 # incr failure count
self.rtcCheckins[rtc][0] = False # setting last check to failure
except:
pass
for rtc in self.rtcList:
if self.rtcCheckins[rtc][1] > 2: # didn't answer for a whole minute
self.rtcCheckins[rtc][1] = 0
self.sendError(rtc)
đừng quên rằng UDP không đảm bảo phân phối đáng tin cậy: http://en.wikipedia.org/wiki/User_Datagram_Protocol –
Tôi biết điều đó, nhưng hệ thống kế thừa ở đây đang sử dụng UDP khá đáng tin cậy trong 15 năm hoặc lâu hơn và phần còn lại của hệ thống không có vấn đề như vậy. – flowInTheDark