bool CDeviceConnector::ConnectMixMode(CONNECT_UNIT *pUnit) { InitTcpConnectProc(); WaitForConnect(TCP_EARLIER_TIME); if (m_bConnected) { assert(m_bTcp); pUnit->pMultiNet = m_pTcpMultiNet; pUnit->sock = m_sock; return true; } InitUdtConnectProc(); WaitForConnect(UDT_TIME_OUT); if (m_bConnected) { if (m_bTcp) { pUnit->pMultiNet = m_pTcpMultiNet; } else { pUnit->pMultiNet = m_pNatMultiNet; } pUnit->sock = m_sock; } return m_bConnected; }
/* ARGSUSED */ static int TcpInputProc( ClientData instanceData, /* Socket state. */ char *buf, /* Where to store data read. */ int bufSize, /* How much space is available in the * buffer? */ int *errorCodePtr) /* Where to store error code. */ { TcpState *statePtr = instanceData; int bytesRead; *errorCodePtr = 0; if (WaitForConnect(statePtr, errorCodePtr) != 0) { return -1; } bytesRead = recv(statePtr->fds.fd, buf, (size_t) bufSize, 0); if (bytesRead > -1) { return bytesRead; } if (errno == ECONNRESET) { /* * Turn ECONNRESET into a soft EOF condition. */ return 0; } *errorCodePtr = errno; return -1; }
bool CDeviceConnector::ConnectUdtMode(CONNECT_UNIT *pUnit) { InitUdtConnectProc(); WaitForConnect(UDT_TIME_OUT); if (m_bConnected) { assert(!m_bTcp); pUnit->pMultiNet = m_pNatMultiNet; pUnit->sock = m_sock; } return m_bConnected; }
bool CDeviceConnector::ConnectTcpMode(CONNECT_UNIT *pUnit) { InitTcpConnectProc(); WaitForConnect(TCP_TIME_OUT); if (m_bConnected) { assert(m_bTcp); pUnit->pMultiNet = m_pTcpMultiNet; pUnit->sock = m_sock; } return m_bConnected; }
int Socket::Connect(const std::string& addr, const std::string& port) { int rc; struct sockaddr_in serv_addr; memset( &serv_addr, 0, sizeof(struct sockaddr_in) ); serv_addr.sin_family = AF_INET; serv_addr.sin_addr.s_addr = inet_addr( addr.c_str() ); serv_addr.sin_port = htons(atoi(port.c_str())); rc = lwip_connect( socket_->fd, (struct sockaddr*)&serv_addr, sizeof(serv_addr) ); if (rc < 0 && errno == EINPROGRESS) rc = 0; return WaitForConnect(); }
int Socket::Connect(const std::string& addr, const std::string& port) { int rc; char str[INET6_ADDRSTRLEN]; bool success = false; struct addrinfo *AddrInfo, *AI; AddrInfo = toAddrinfo( addr, port, false ); for ( AI = AddrInfo; AI != NULL; AI = AI->ai_next ) { struct sockaddr_in6 connectAddr; toIpv6( AI, &connectAddr ); if ( ( IN6_IS_ADDR_LINKLOCAL((struct in6_addr *) &connectAddr.sin6_addr) ) && ( connectAddr.sin6_scope_id == 0) ) { log(LOG_WARN) << "IPv6 link local addresses should specify a scope ID!"; } inet_ntop( AF_INET6, &connectAddr.sin6_addr, str, sizeof(str)); log(LOG_NOTICE) << "attempting connect to \"" << addr << "\" -> ip " << str << " port " << ntohs(connectAddr.sin6_port); rc = connect( socket_->fd, (struct sockaddr*) &connectAddr, sizeof(connectAddr) ); if (rc < 0 && errno != EINPROGRESS) { log(LOG_EMERG) << "connect attempt failed with error " << strerror(errno); } else { success = true; break; } } if ( AddrInfo ) freeaddrinfo( AddrInfo ); return success ? WaitForConnect() : -1; }
static int TcpOutputProc( ClientData instanceData, /* Socket state. */ const char *buf, /* The data buffer. */ int toWrite, /* How many bytes to write? */ int *errorCodePtr) /* Where to store error code. */ { TcpState *statePtr = instanceData; int written; *errorCodePtr = 0; if (WaitForConnect(statePtr, errorCodePtr) != 0) { return -1; } written = send(statePtr->fds.fd, buf, (size_t) toWrite, 0); if (written > -1) { return written; } *errorCodePtr = errno; return -1; }
static int TcpGetOptionProc( ClientData instanceData, /* Socket state. */ Tcl_Interp *interp, /* For error reporting - can be NULL. */ const char *optionName, /* Name of the option to retrieve the value * for, or NULL to get all options and their * values. */ Tcl_DString *dsPtr) /* Where to store the computed value; * initialized by caller. */ { TcpState *statePtr = instanceData; size_t len = 0; WaitForConnect(statePtr, NULL); if (optionName != NULL) { len = strlen(optionName); } if ((len > 1) && (optionName[1] == 'e') && (strncmp(optionName, "-error", len) == 0)) { socklen_t optlen = sizeof(int); if (statePtr->flags & TCP_ASYNC_CONNECT) { /* Suppress errors as long as we are not done */ errno = 0; } else if (statePtr->connectError != 0) { errno = statePtr->connectError; statePtr->connectError = 0; } else { int err; getsockopt(statePtr->fds.fd, SOL_SOCKET, SO_ERROR, (char *) &err, &optlen); errno = err; } if (errno != 0) { Tcl_DStringAppend(dsPtr, Tcl_ErrnoMsg(errno), -1); } return TCL_OK; } if ((len > 1) && (optionName[1] == 'c') && (strncmp(optionName, "-connecting", len) == 0)) { Tcl_DStringAppend(dsPtr, (statePtr->flags & TCP_ASYNC_CONNECT) ? "1" : "0", -1); return TCL_OK; } if ((len == 0) || ((len > 1) && (optionName[1] == 'p') && (strncmp(optionName, "-peername", len) == 0))) { address peername; socklen_t size = sizeof(peername); if ( (statePtr->flags & TCP_ASYNC_CONNECT) ) { /* * In async connect output an empty string */ if (len == 0) { Tcl_DStringAppendElement(dsPtr, "-peername"); Tcl_DStringAppendElement(dsPtr, ""); } else { return TCL_OK; } } else if (getpeername(statePtr->fds.fd, &peername.sa, &size) >= 0) { /* * Peername fetch succeeded - output list */ if (len == 0) { Tcl_DStringAppendElement(dsPtr, "-peername"); Tcl_DStringStartSublist(dsPtr); } TcpHostPortList(interp, dsPtr, peername, size); if (len) { return TCL_OK; } Tcl_DStringEndSublist(dsPtr); } else { /* * getpeername failed - but if we were asked for all the options * (len==0), don't flag an error at that point because it could be * an fconfigure request on a server socket (which have no peer). * Same must be done on win&mac. */ if (len) { if (interp) { Tcl_SetObjResult(interp, Tcl_ObjPrintf( "can't get peername: %s", Tcl_PosixError(interp))); } return TCL_ERROR; } } } if ((len == 0) || ((len > 1) && (optionName[1] == 's') && (strncmp(optionName, "-sockname", len) == 0))) { TcpFdList *fds; address sockname; socklen_t size; int found = 0; if (len == 0) { Tcl_DStringAppendElement(dsPtr, "-sockname"); Tcl_DStringStartSublist(dsPtr); } if ( (statePtr->flags & TCP_ASYNC_CONNECT) ) { /* * In async connect output an empty string */ found = 1; } else { for (fds = &statePtr->fds; fds != NULL; fds = fds->next) { size = sizeof(sockname); if (getsockname(fds->fd, &(sockname.sa), &size) >= 0) { found = 1; TcpHostPortList(interp, dsPtr, sockname, size); } } } if (found) { if (len) { return TCL_OK; } Tcl_DStringEndSublist(dsPtr); } else { if (interp) { Tcl_SetObjResult(interp, Tcl_ObjPrintf( "can't get sockname: %s", Tcl_PosixError(interp))); } return TCL_ERROR; } } if (len > 0) { return Tcl_BadChannelOption(interp, optionName, "connecting peername sockname"); } return TCL_OK; }