//---------------------------------------------------------------------- // listen //---------------------------------------------------------------------- bool NamedPipeConnection::listen() { LBASSERT( getDescription()->type == CONNECTIONTYPE_NAMEDPIPE ); if( !isClosed( )) return false; _setState( STATE_CONNECTING ); _initAIOAccept(); _setState( STATE_LISTENING ); LBINFO << "Listening on " << getDescription()->toString() << std::endl; return true; }
//---------------------------------------------------------------------- // listen //---------------------------------------------------------------------- bool SocketConnection::listen() { ConnectionDescriptionPtr description = _getDescription(); LBASSERT( description->type == CONNECTIONTYPE_TCPIP ); if( !isClosed( )) return false; _setState( STATE_CONNECTING ); sockaddr_in address; const size_t size = sizeof( sockaddr_in ); if( !_parseAddress( description, address )) { LBWARN << "Can't parse connection parameters" << std::endl; return false; } if( !_createSocket()) return false; const bool bound = (::bind( _readFD, (sockaddr *)&address, size ) == 0); if( !bound ) { LBWARN << "Could not bind socket " << _readFD << ": " << lunchbox::sysError << " to " << getHostName( address ) << ":" << ntohs( address.sin_port ) << " AF " << (int)address.sin_family << std::endl; close(); return false; } if( ::listen( _readFD, SOMAXCONN ) != 0 ) { LBWARN << "Could not listen on socket: " << lunchbox::sysError << std::endl; close(); return false; } // get socket parameters socklen_t used = size; getsockname( _readFD, (struct sockaddr *)&address, &used ); description->port = ntohs( address.sin_port ); std::string hostname = description->getHostname(); if( hostname.empty( )) { if( address.sin_addr.s_addr == INADDR_ANY ) { char cHostname[256] = {0}; gethostname( cHostname, 256 ); hostname = cHostname; description->setHostname( hostname ); } else description->setHostname( getHostName( address )); } _initAIOAccept(); _setState( STATE_LISTENING ); LBDEBUG << "Listening on " << description->getHostname() << "[" << getHostName( address ) << "]:" << description->port << " (" << description->toString() << ")" << std::endl; return true; }
//---------------------------------------------------------------------- // listen //---------------------------------------------------------------------- bool PGMConnection::listen() { EQASSERT( _description->type == CONNECTIONTYPE_PGM ); if( _state != STATE_CLOSED ) return false; _state = STATE_CONNECTING; _fireStateChanged(); sockaddr_in address; const size_t size = sizeof( sockaddr_in ); if( !_parseAddress( address )) { EQWARN << "Can't parse connection parameters" << std::endl; return false; } //-- create a 'listening' read socket _readFD = _initSocket( address ); if( _readFD == INVALID_SOCKET || !_setupReadSocket( )) { close(); return false; } const bool listening = (::listen( _readFD, 10 ) == 0); if( !listening ) { EQWARN << "Could not listen on socket: " << base::sysError << std::endl; close(); return false; } // get listening socket parameters socklen_t used = size; getsockname( _readFD, (struct sockaddr *)&address, &used ); _description->port = ntohs( address.sin_port ); const std::string& hostname = _description->getHostname(); if( hostname.empty( )) { if( address.sin_addr.s_addr == INADDR_ANY ) { char cHostname[256]; gethostname( cHostname, 256 ); _description->setHostname( cHostname ); } else _description->setHostname( inet_ntoa( address.sin_addr )); } _initAIOAccept(); //-- create a connected 'write' socket address.sin_family = AF_INET; address.sin_addr.s_addr = htonl( INADDR_ANY ); address.sin_port = htons( 0 ); memset( &(address.sin_zero), 0, 8 ); // zero the rest _writeFD = _initSocket( address ); if( _writeFD == INVALID_SOCKET || !_setupSendSocket( )) { close(); return false; } _parseAddress( address ); #ifdef _WIN32 const bool connected = WSAConnect( _writeFD, (sockaddr*)&address, size, 0, 0, 0, 0 ) == 0; #else const bool connected = (::connect( _readFD, (sockaddr*)&address, size ) == 0); #endif if( !connected ) { EQWARN << "Could not connect to '" << _description->getHostname() << ":" << _description->port << "': " << base::sysError << std::endl; close(); return false; } _state = STATE_LISTENING; _fireStateChanged(); EQINFO << "Listening on " << _description->getHostname() << "[" << inet_ntoa( address.sin_addr ) << "]:" << _description->port << " (" << _description->toString() << ")" << std::endl; return true; }