AREXPORT bool ArUrg_2_0::blockingConnect(void) { if (!getRunning()) runAsync(); myConnMutex.lock(); if (myConn == NULL) { ArLog::log(ArLog::Terse, "%s: Could not connect because there is no connection defined", getName()); myConnMutex.unlock(); failedToConnect(); return false; } ArSerialConnection *serConn = NULL; serConn = dynamic_cast<ArSerialConnection *>(myConn); // if we have a starting baud and are a serial port, then change the // baud rate... not by default this will set it to 0 baud which'll // cause the serial stuff not to touch it if (serConn != NULL) serConn->setBaud(atoi(getStartingBaudChoice())); if (myConn->getStatus() != ArDeviceConnection::STATUS_OPEN && !myConn->openSimple()) { ArLog::log(ArLog::Terse, "%s: Could not connect because the connection was not open and could not open it", getName()); myConnMutex.unlock(); failedToConnect(); return false; } myConnMutex.unlock(); lockDevice(); myTryingToConnect = true; unlockDevice(); laserPullUnsetParamsFromRobot(); laserCheckParams(); ArUtil::sleep(100); bool connected = false; if (internalConnect()) connected = true; if (connected) { lockDevice(); myIsConnected = true; myTryingToConnect = false; unlockDevice(); ArLog::log(ArLog::Normal, "%s: Connected to laser", getName()); laserConnect(); return true; } else { failedToConnect(); return false; } }
AREXPORT bool ArUrg::blockingConnect(void) { if (!getRunning()) runAsync(); myConnMutex.lock(); if (myConn == NULL) { ArLog::log(ArLog::Terse, "%s: Could not connect because there is no connection defined", getName()); myConnMutex.unlock(); failedToConnect(); return false; } ArSerialConnection *serConn = NULL; serConn = dynamic_cast<ArSerialConnection *>(myConn); if (serConn != NULL) serConn->setBaud(atoi(getStartingBaudChoice())); if (myConn->getStatus() != ArDeviceConnection::STATUS_OPEN && !myConn->openSimple()) { ArLog::log(ArLog::Terse, "%s: Could not connect because the connection was not open and could not open it", getName()); myConnMutex.unlock(); failedToConnect(); return false; } myConnMutex.unlock(); lockDevice(); myTryingToConnect = true; unlockDevice(); laserPullUnsetParamsFromRobot(); laserCheckParams(); setParams(getStartDegrees(), getEndDegrees(), getIncrement(), getFlipped()); ArUtil::sleep(100); bool connected = false; if (internalConnect()) connected = true; if (connected) { lockDevice(); myIsConnected = true; myTryingToConnect = false; unlockDevice(); ArLog::log(ArLog::Normal, "%s: Connected to laser", getName()); laserConnect(); return true; } else { failedToConnect(); return false; } }
bool Socket_TCP::connectTo(const char * hostname, uint16_t port, uint32_t timeout) { char servport[32]; int rc; struct in6_addr serveraddr; struct addrinfo hints, *res=NULL; memset(&hints, 0x00, sizeof(hints)); #ifdef _WIN32 hints.ai_flags = 0; #else hints.ai_flags = AI_NUMERICSERV; #endif hints.ai_family = AF_UNSPEC; hints.ai_socktype = SOCK_STREAM; rc = inet_pton(AF_INET, hostname, &serveraddr); if (rc == 1) { hints.ai_family = AF_INET; hints.ai_flags |= AI_NUMERICHOST; } else { rc = inet_pton(AF_INET6, hostname, &serveraddr); if (rc == 1) { hints.ai_family = AF_INET6; hints.ai_flags |= AI_NUMERICHOST; } } snprintf(servport,32,"%u",port); rc = getaddrinfo(hostname, servport, &hints, &res); if (rc != 0) { // Host not found. lastError = "Error resolving hostname"; return false; } bool connected = false; for (struct addrinfo *resiter=res; resiter && !connected; resiter = resiter->ai_next) { if (getSocket() >=0 ) closeSocket(); setSocket(socket(res->ai_family, res->ai_socktype, res->ai_protocol)); if (!isValidSocket()) { lastError = "socket() failed"; break; } // Set the read timeout here. (to zero) setReadTimeout(0); if (internalConnect(getSocket(),resiter->ai_addr, resiter->ai_addrlen,timeout)) { // now it's connected... if (PostConnectSubInitialization()) { connected = true; } else { // should disconnect here. shutdownSocket(); // drop the socket descriptor. we don't need it anymore. closeSocket(); } break; } else { // drop the current socket... (and free the resource :)) shutdownSocket(); closeSocket(); } } freeaddrinfo(res); if (!connected) { lastError = "connect() failed"; return false; } return true; }