diff --git a/main.c b/main.c
index e394a48a6054f3f32b1b51a7b469370771fe1262..6eded9839e693f1ac2ce1ef33a96724783085e52 100644
--- a/main.c
+++ b/main.c
@@ -638,6 +638,8 @@ rfbScreenInfoPtr rfbGetScreen(int* argc,char** argv,
    /* initialize client list and iterator mutex */
    rfbClientListInit(rfbScreen);
 
+   rfbScreen->ignoreSIGPIPE = TRUE;
+
    return(rfbScreen);
 }
 
@@ -747,6 +749,8 @@ void rfbScreenCleanup(rfbScreenInfoPtr rfbScreen)
 #endif
 }
 
+static void ignoreSignal(int dummy) {}
+
 void rfbInitServer(rfbScreenInfoPtr rfbScreen)
 {
 #ifdef WIN32
@@ -755,6 +759,8 @@ void rfbInitServer(rfbScreenInfoPtr rfbScreen)
 #endif
   rfbInitSockets(rfbScreen);
   httpInitSockets(rfbScreen);
+  if(rfbScreen->ignoreSIGPIPE)
+    signal(SIGPIPE,ignoreSignal);
 }
 
 #ifndef LIBVNCSERVER_HAVE_GETTIMEOFDAY
diff --git a/rfb/rfb.h b/rfb/rfb.h
index f56e6920a9c840dcf8d2f4f6e0cc5e4a511ca440..a571235f2a4e18a59231a0f9c917b5f117cbbeba 100644
--- a/rfb/rfb.h
+++ b/rfb/rfb.h
@@ -274,6 +274,7 @@ typedef struct _rfbScreenInfo
     rfbBool backgroundLoop;
 #endif
 
+    rfbBool ignoreSIGPIPE;
 } rfbScreenInfo, *rfbScreenInfoPtr;