]> granicus.if.org Git - icinga2/commitdiff
Improved socket error handling.
authorGunnar Beutner <gunnar.beutner@netways.de>
Wed, 4 Apr 2012 14:02:19 +0000 (16:02 +0200)
committerGunnar Beutner <gunnar.beutner@netways.de>
Wed, 4 Apr 2012 14:02:19 +0000 (16:02 +0200)
base/socket.cpp
base/socket.h
base/tcpclient.cpp
base/tcpsocket.cpp

index aba6d054c6a1b5225e3af500549fc4408d92ea0a..42f603aa850e0411c26082c6fbd7ac8e1a740d58 100644 (file)
@@ -99,7 +99,7 @@ int Socket::ExceptionEventHandler(EventArgs::Ptr ea)
        if (opt != 0) {
                SocketErrorEventArgs::Ptr ea = make_shared<SocketErrorEventArgs>();
                ea->Code = opt;
-               ea->Message = FormatErrorCode(opt);
+               ea->Message = FormatErrorCode(ea->Code);
                OnError(ea);
 
                Close();
index 1583621ea9a2f795105bd4f9d5a490c3cbff210b..ca6179b431706d9eafda69a36d23361fa5683655 100644 (file)
@@ -19,6 +19,7 @@ private:
 
        int ExceptionEventHandler(EventArgs::Ptr ea);
 
+protected:
        string FormatErrorCode(int errorCode);
 
 protected:
index 19fb82095c2c37d287626b05dd1bc51fc67234e2..9dcd4d2e7442f2b4622e5be512a39e8bbb96154d 100644 (file)
@@ -37,11 +37,22 @@ void TCPClient::Connect(const string& hostname, unsigned short port)
        int rc = connect(GetFD(), (sockaddr *)&sin, sizeof(sin));
 
 #ifdef _WIN32
-       if (rc < 0 && WSAGetLastError() != WSAEWOULDBLOCK)
+       if (rc < 0 && WSAGetLastError() != WSAEWOULDBLOCK) {
 #else /* _WIN32 */
-       if (rc < 0 && errno != EINPROGRESS)
+       if (rc < 0 && errno != EINPROGRESS) {
 #endif /* _WIN32 */
+               SocketErrorEventArgs::Ptr ea = make_shared<SocketErrorEventArgs>();
+#ifdef _WIN32
+               ea->Code = WSAGetLastError();
+#else /* _WIN32 */
+               ea->Code = errno;
+#endif /* _WIN32 */
+               ea->Message = FormatErrorCode(ea->Code);
+
+               OnError(ea);
+
                Close();
+       }
 
        m_PeerHost = hostname;
        m_PeerPort = port;
@@ -84,6 +95,18 @@ int TCPClient::ReadableEventHandler(EventArgs::Ptr ea)
                return 0;
 
        if (rc <= 0) {
+               if (rc < 0) {
+                       SocketErrorEventArgs::Ptr ea = make_shared<SocketErrorEventArgs>();
+#ifdef _WIN32
+                       ea->Code = WSAGetLastError();
+#else /* _WIN32 */
+                       ea->Code = errno;
+#endif /* _WIN32 */
+                       ea->Message = FormatErrorCode(ea->Code);
+
+                       OnError(ea);
+               }
+
                Close();
                return 0;
        }
@@ -104,6 +127,18 @@ int TCPClient::WritableEventHandler(EventArgs::Ptr ea)
        rc = send(GetFD(), (const char *)m_SendQueue->GetReadBuffer(), m_SendQueue->GetSize(), 0);
 
        if (rc <= 0) {
+               if (rc < 0) {
+                       SocketErrorEventArgs::Ptr ea = make_shared<SocketErrorEventArgs>();
+#ifdef _WIN32
+                       ea->Code = WSAGetLastError();
+#else /* _WIN32 */
+                       ea->Code = errno;
+#endif /* _WIN32 */
+                       ea->Message = FormatErrorCode(ea->Code);
+
+                       OnError(ea);
+               }
+
                Close();
                return 0;
        }
index cfc3739543c6ebc63714a60d77072b1cc9c17f6e..009d95194263445d1eba49e2f4c9ef29c6910196 100644 (file)
@@ -8,8 +8,16 @@ void TCPSocket::MakeSocket(void)
 
        int fd = socket(AF_INET, SOCK_STREAM, 0);
 
-       if (fd == INVALID_SOCKET)
-               throw exception(/*"socket() failed."*/);
+       if (fd == INVALID_SOCKET) {
+               SocketErrorEventArgs::Ptr ea = make_shared<SocketErrorEventArgs>();
+#ifdef _WIN32
+               ea->Code = WSAGetLastError();
+#else /* _WIN32 */
+               ea->Code = errno;
+#endif /* _WIN32 */
+               ea->Message = FormatErrorCode(ea->Code);
+               OnError(ea);
+       }
 
        SetFD(fd);
 }
@@ -30,6 +38,17 @@ void TCPSocket::Bind(const char *hostname, unsigned short port)
 
        int rc = ::bind(GetFD(), (sockaddr *)&sin, sizeof(sin));
 
-       if (rc < 0)
+       if (rc < 0) {
+               SocketErrorEventArgs::Ptr ea = make_shared<SocketErrorEventArgs>();
+#ifdef _WIN32
+               ea->Code = WSAGetLastError();
+#else /* _WIN32 */
+               ea->Code = errno;
+#endif /* _WIN32 */
+               ea->Message = FormatErrorCode(ea->Code);
+
+               OnError(ea);
+               
                Close();
+       }
 }