Browse Source

core: network: avoid raising SIGPIPE

Daniele Bartolini 6 năm trước cách đây
mục cha
commit
6cbb501776
2 tập tin đã thay đổi với 5 bổ sung1 xóa
  1. 4 1
      src/core/network/socket.cpp
  2. 1 0
      src/core/network/socket.h

+ 4 - 1
src/core/network/socket.cpp

@@ -24,6 +24,7 @@
 	#define WSAEWOULDBLOCK EWOULDBLOCK
 #elif CROWN_PLATFORM_WINDOWS
 	#include <winsock2.h>
+	#define MSG_NOSIGNAL 0
 #endif // CROWN_PLATFORM_POSIX
 
 namespace crown
@@ -130,7 +131,7 @@ namespace socket_internal
 			int bytes_wrote = ::send(socket
 				, (char*)data + wr.bytes_wrote
 				, to_write
-				, 0
+				, MSG_NOSIGNAL // Don't generate SIGPIPE, return EPIPE instead.
 				);
 
 			if (bytes_wrote == SOCKET_ERROR)
@@ -139,6 +140,8 @@ namespace socket_internal
 					wr.error = WriteResult::WOULDBLOCK;
 				else if (last_error() == WSAETIMEDOUT)
 					wr.error = WriteResult::TIMEOUT;
+				else if (last_error() == EPIPE)
+					wr.error = WriteResult::PIPE;
 				else
 					wr.error = WriteResult::UNKNOWN;
 				return wr;

+ 1 - 0
src/core/network/socket.h

@@ -62,6 +62,7 @@ struct WriteResult
 		WOULDBLOCK,
 		REMOTE_CLOSED,
 		TIMEOUT,
+		PIPE,
 		UNKNOWN
 	} error;
 	u32 bytes_wrote;