void TransportUDP::socketUpdate(int events) { { boost::mutex::scoped_lock lock(close_mutex_); if (closed_) { return; } } if((events & POLLERR) || (events & POLLHUP) || (events & POLLNVAL)) { ROSCPP_LOG_DEBUG("Socket %d closed with (ERR|HUP|NVAL) events %d", sock_, events); close(); } else { if ((events & POLLIN) && expecting_read_) { if (read_cb_) { read_cb_(shared_from_this()); } } if ((events & POLLOUT) && expecting_write_) { if (write_cb_) { write_cb_(shared_from_this()); } } } }
void TransportTCP::socketUpdate(int events) { { boost::recursive_mutex::scoped_lock lock(close_mutex_); if (closed_) { return; } // Handle read events before err/hup/nval, since there may be data left on the wire if ((events & POLLIN) && expecting_read_) { if (is_server_) { // Should not block here, because poll() said that it's ready // for reading TransportTCPPtr transport = accept(); if (transport) { ROS_ASSERT(accept_cb_); accept_cb_(transport); } } else { if (read_cb_) { read_cb_(shared_from_this()); } } } if ((events & POLLOUT) && expecting_write_) { if (write_cb_) { write_cb_(shared_from_this()); } } } if((events & POLLERR) || (events & POLLHUP) || (events & POLLNVAL)) { uint32_t error = -1; socklen_t len = sizeof(error); if (getsockopt(sock_, SOL_SOCKET, SO_ERROR, reinterpret_cast<char*>(&error), &len) < 0) { ROSCPP_LOG_DEBUG("getsockopt failed on socket [%d]", sock_); } #ifdef _MSC_VER char err[60]; strerror_s(err,60,error); ROSCPP_LOG_DEBUG("Socket %d closed with (ERR|HUP|NVAL) events %d: %s", sock_, events, err); #else ROSCPP_LOG_DEBUG("Socket %d closed with (ERR|HUP|NVAL) events %d: %s", sock_, events, strerror(error)); #endif close(); } }