ConnectionError ConnectionTCPServer::recv( int timeout ) { m_recvMutex.lock(); if( m_cancel || m_socket < 0 || !m_connectionHandler ) { m_recvMutex.unlock(); return ConnNotConnected; } if( !dataAvailable( timeout ) ) { m_recvMutex.unlock(); return ConnNoError; } struct sockaddr_in they; int sin_size = sizeof( struct sockaddr_in ); #ifdef WIN32 int newfd = accept( m_socket, (struct sockaddr*)&they, &sin_size ); #else int newfd = accept( m_socket, (struct sockaddr*)&they, (socklen_t*)&sin_size ); #endif m_recvMutex.unlock(); ConnectionTCPClient* conn = new ConnectionTCPClient( m_logInstance, inet_ntoa( they.sin_addr ), ntohs( they.sin_port ) ); conn->setSocket( newfd ); m_connectionHandler->handleIncomingConnection( conn ); return ConnNoError; }
void Client::handleQuery( const std::string& addr ) { if( m_rRef ) { DNSServiceRefDeallocate( m_rRef ); m_rRef = 0; } ConnectionTCPClient* connection = new ConnectionTCPClient( this, logInstance(), addr, m_port ); // printf( "LinkLocal::Client: connecting to %s:%d\n", addr.c_str(), m_port ); ConnectionError e = connection->connect(); if( e != ConnNoError ) { // printf( "connection error: %d\n", e ); delete connection; } }
ConnectionError ConnectionTCPServer::recv( int timeout ) { m_recvMutex.lock(); if( m_cancel || m_socket < 0 || !m_connectionHandler ) { m_recvMutex.unlock(); return ConnNotConnected; } if( !dataAvailable( timeout ) ) { m_recvMutex.unlock(); return ConnNoError; } struct sockaddr_storage they; int addr_size = sizeof( struct sockaddr_storage ); #if defined( _WIN32 ) && !defined( __SYMBIAN32__ ) int newfd = static_cast<int>( accept( static_cast<SOCKET>( m_socket ), (struct sockaddr*)&they, &addr_size ) ); #else int newfd = accept( m_socket, (struct sockaddr*)&they, (socklen_t*)&addr_size ); #endif m_recvMutex.unlock(); char buffer[INET6_ADDRSTRLEN]; char portstr[NI_MAXSERV]; int err = getnameinfo( (struct sockaddr*)&they, addr_size, buffer, sizeof( buffer ), portstr, sizeof( portstr ), NI_NUMERICHOST | NI_NUMERICSERV ); if( !err ) return ConnIoError; ConnectionTCPClient* conn = new ConnectionTCPClient( m_logInstance, buffer, atoi( portstr ) ); conn->setSocket( newfd ); m_connectionHandler->handleIncomingConnection( this, conn ); return ConnNoError; }