浏览代码

Proper error handling in TcpServer

Paul-Louis Ageneau 4 年之前
父节点
当前提交
59e7ed5be9
共有 2 个文件被更改,包括 16 次插入6 次删除
  1. 14 5
      src/impl/tcpserver.cpp
  2. 2 1
      src/impl/tcptransport.cpp

+ 14 - 5
src/impl/tcpserver.cpp

@@ -55,20 +55,29 @@ shared_ptr<TcpTransport> TcpServer::accept() {
 		if (mSock == INVALID_SOCKET)
 			break;
 
-		if (ret < 0)
-			throw std::runtime_error("Failed to wait on socket");
+		if (ret < 0) {
+			if (sockerrno == SEINTR || sockerrno == SEAGAIN) // interrupted
+				continue;
+			else
+				throw std::runtime_error("Failed to wait for socket connection");
+		}
 
 		if (FD_ISSET(mSock, &readfds)) {
 			struct sockaddr_storage addr;
 			socklen_t addrlen = sizeof(addr);
 			socket_t incomingSock = ::accept(mSock, (struct sockaddr *)&addr, &addrlen);
-			if (incomingSock == INVALID_SOCKET)
-				break;
 
-			return std::make_shared<TcpTransport>(incomingSock, nullptr); // no state callback
+			if (incomingSock != INVALID_SOCKET) {
+				return std::make_shared<TcpTransport>(incomingSock, nullptr); // no state callback
+
+			} else if (sockerrno != SEAGAIN && sockerrno != SEWOULDBLOCK) {
+				PLOG_ERROR << "TCP server failed, errno=" << sockerrno;
+				throw std::runtime_error("TCP server failed");
+			}
 		}
 	}
 
+	PLOG_DEBUG << "TCP server closed";
 	return nullptr;
 }
 

+ 2 - 1
src/impl/tcptransport.cpp

@@ -273,7 +273,8 @@ bool TcpTransport::trySendMessage(message_ptr &message) {
 				message = make_message(message->end() - size, message->end());
 				return false;
 			} else {
-				throw std::runtime_error("Connection closed, errno=" + std::to_string(sockerrno));
+				PLOG_ERROR << "Connection closed, errno=" << sockerrno;
+				throw std::runtime_error("Connection closed");
 			}
 		}