From 60de543c7596b4e8bbdfb8e629e9131f85ee0bf2 Mon Sep 17 00:00:00 2001
From: Mark Tearle <mark@tearle.com>
Date: Sat, 22 Nov 2014 16:25:39 +0800
Subject: [PATCH] BUGFIX: Fix error handling around socket disconnects

---
 virtualsnack.py | 25 ++++++++++++++++++++++---
 1 file changed, 22 insertions(+), 3 deletions(-)

diff --git a/virtualsnack.py b/virtualsnack.py
index 0b69f8d..6d8198a 100755
--- a/virtualsnack.py
+++ b/virtualsnack.py
@@ -5,7 +5,7 @@ from datetime import datetime
 # Incorporates code
 # from http://www.binarytides.com/python-socket-server-code-example/
 # Socket server in python using select function
-import socket, select
+import socket, select, errno
 
 # for emulator code
 import sys
@@ -154,7 +154,7 @@ class VirtualSnackApp(npyscreen.NPSAppManaged):
                 except:
                     #print "Client (%s, %s) is offline" % addr
                     sock.close()
-                    self.CONNECTION_LIST.remove(sock)
+                    #self.CONNECTION_LIST.remove(sock)
                     continue
              
 
@@ -168,7 +168,26 @@ class VirtualSnackApp(npyscreen.NPSAppManaged):
         read_sockets,write_sockets,error_sockets = select.select([],self.CONNECTION_LIST,[],0.01)
  
         for sock in write_sockets:
-		sock.send(data)
+		try:
+			sock.send(data)
+		except socket.error, e:
+			if isinstance(e.args, tuple):
+				self.sent = "errno is %d" % e[0]
+				if e[0] == errno.EPIPE:
+				# remote peer disconnected
+					self.sent = "Detected remote disconnect"
+				else:
+				# determine and handle different error
+					pass
+			else:
+				self.sent = "socket error ", e
+               		self.CONNECTION_LIST.remove(sock)
+			sock.close()
+			return
+		except IOError, e:
+			# Hmmm, Can IOError actually be raised by the socket module?
+			self.sent = "Got IOError: ", e
+			return
 
 	self.sent = data
 
-- 
GitLab