何か問題があり、それはコードだと思います。
このアプリケーションは、一部のカスタムメイドのネットワーク デバイスに「ping」を実行して、それらが動作しているかどうかを確認するために使用されます。特別な UDP パケットを使用して 20 秒ごとに ping を実行し、応答を待ちます。3 回連続して ping に応答しない場合、アプリケーションはスタッフに警告メッセージを送信します。
アプリケーションは 24 時間年中無休で実行されており、1 日にランダムな回数 (主に 2 ~ 5 回)、アプリケーションが UDP パケットの受信に正確に 10 分間失敗した後、すべてが正常に戻ります。この 10 分間、応答しているように見えるデバイスは 1 つだけで、他のデバイスは停止しているように見えます。ログから推測できたこと。
Wireshark を使用してパケットを盗聴し、ping パケットが送信と受信の両方で送信されることを確認したので、ネットワーク部分は OS まで問題なく動作しているようです。コンピューターは WinXPPro を実行しており、ファイアウォールがまったく構成されていないコンピューターもあります。この問題は、さまざまなコンピューター、さまざまな Windows インストール、およびさまざまなネットワークで発生しています。
ここで何が問題なのか、私は本当に途方に暮れています。
すべてのネットワークを実行するコードの関連部分を添付します。これは、アプリケーションの残りの部分とは別のスレッドで実行されます。
あなたが提供するかもしれないどんな洞察にも、前もって感謝します。
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)