From 1ea57f62d55c77a2f3e389647202ed357ace7fee Mon Sep 17 00:00:00 2001 From: bxwllzz Date: Thu, 18 May 2017 00:23:25 +0800 Subject: [PATCH] Fix bug in transport_tcp (#1050) * Fix bug in transport_tcp It assumes that the `connect` method of non-blocking scoket should return -1 and `last_socket_error()` should return `ROS_SOCKETS_ASYNCHRONOUS_CONNECT_RETURN`(=`EINPROGRESS`). But a non-blocking `connect` can return 0 when TCP connection to 127.0.0.1 (localhost). [http://stackoverflow.com/questions/14027326/can-connect-return-0-with-non-blocing-socket](http://stackoverflow.com/questions/14027326/can-connect-return-0-with-non-blocing-socket) * Modify code format Modify code format --- clients/roscpp/src/libros/transport/transport_tcp.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/clients/roscpp/src/libros/transport/transport_tcp.cpp b/clients/roscpp/src/libros/transport/transport_tcp.cpp index f37234d236..4d330f6e06 100644 --- a/clients/roscpp/src/libros/transport/transport_tcp.cpp +++ b/clients/roscpp/src/libros/transport/transport_tcp.cpp @@ -312,9 +312,10 @@ bool TransportTCP::connect(const std::string& host, int port) int ret = ::connect(sock_, (sockaddr*) &sas, sas_len); // windows might need some time to sleep (input from service robotics hack) add this if testing proves it is necessary. - ROS_ASSERT((flags_ & SYNCHRONOUS) || ret != 0); + // ROS_ASSERT((flags_ & SYNCHRONOUS) || ret != 0); if (((flags_ & SYNCHRONOUS) && ret != 0) || // synchronous, connect() should return 0 - (!(flags_ & SYNCHRONOUS) && last_socket_error() != ROS_SOCKETS_ASYNCHRONOUS_CONNECT_RETURN)) // asynchronous, connect() should return -1 and WSAGetLastError()=WSAEWOULDBLOCK/errno=EINPROGRESS + (!(flags_ & SYNCHRONOUS) && ret != 0 && last_socket_error() != ROS_SOCKETS_ASYNCHRONOUS_CONNECT_RETURN)) + // asynchronous, connect() may return 0 or -1. When return -1, WSAGetLastError()=WSAEWOULDBLOCK/errno=EINPROGRESS { ROSCPP_CONN_LOG_DEBUG("Connect to tcpros publisher [%s:%d] failed with error [%d, %s]", host.c_str(), port, ret, last_socket_error_string()); close();