bool UnixDomainSocketAcceptor::Accept() { struct sockaddr_un remoteAddress; memset(&remoteAddress, 0, sizeof (struct sockaddr_un)); socklen_t len = sizeof (struct sockaddr_un); int32_t fd; int32_t error; //1. Accept the connection fd = accept(_inboundFd, (sockaddr *)&remoteAddress, &len); error = LASTSOCKETERROR; if (fd < 0) { FATAL("Unable to accept UX client connection: %s (%d)", strerror(error), error); return false; } if (!_enabled) { CLOSE_SOCKET(fd); _droppedCount++; WARN("Acceptor is not enabled. UX Client dropped: %s", STR(_sockPath)); return true; } INFO("Client connected: %s", STR(_sockPath)); //if (!setFdOptions(fd, false)) { // FATAL("Unable to set unix socket options"); // CLOSE_SOCKET(fd); // return false; //} //2. Create the chain BaseProtocol *pProtocol = ProtocolFactoryManager::CreateProtocolChain( _protocolChain, _parameters); if (pProtocol == NULL) { FATAL("Unable to create protocol chain"); CLOSE_SOCKET(fd); return false; } //3. Create the carrier and bind it UnixDomainSocketCarrier *pUnixDomainSocketCarrier = new UnixDomainSocketCarrier(fd, _sockPath); pUnixDomainSocketCarrier->SetProtocol(pProtocol->GetFarEndpoint()); pProtocol->GetFarEndpoint()->SetIOHandler(pUnixDomainSocketCarrier); //4. Register protocol for thread access UnixDomainSocketManager::RegisterUXThreadProtocol(pUnixDomainSocketCarrier->GetSocketName(), (UnixDomainSocketProtocol *)pUnixDomainSocketCarrier->GetProtocol()); //5. Register the protocol stack with an application if (_pApplication != NULL) { pProtocol = pProtocol->GetNearEndpoint(); pProtocol->SetApplication(_pApplication); } if (pProtocol->GetNearEndpoint()->GetOutputBuffer() != NULL) pProtocol->GetNearEndpoint()->EnqueueForOutbound(); _acceptedCount++; return true; }
bool TCPAcceptor::Accept() { sockaddr address; memset(&address, 0, sizeof (sockaddr)); socklen_t len = sizeof (sockaddr); int32_t fd; int32_t error; //1. Accept the connection fd = accept(_inboundFd, &address, &len); error = errno; if (fd < 0) { FATAL("Unable to accept client connection: %s (%d)", strerror(error), error); return false; } if (!_enabled) { CLOSE_SOCKET(fd); _droppedCount++; WARN("Acceptor is not enabled. Client dropped: %s:%"PRIu16" -> %s:%"PRIu16, inet_ntoa(((sockaddr_in *) & address)->sin_addr), ENTOHS(((sockaddr_in *) & address)->sin_port), STR(_ipAddress), _port); return true; } INFO("Client connected: %s:%"PRIu16" -> %s:%"PRIu16, inet_ntoa(((sockaddr_in *) & address)->sin_addr), ENTOHS(((sockaddr_in *) & address)->sin_port), STR(_ipAddress), _port); if (!setFdOptions(fd)) { FATAL("Unable to set socket options"); CLOSE_SOCKET(fd); return false; } //4. Create the chain BaseProtocol *pProtocol = ProtocolFactoryManager::CreateProtocolChain(_protocolChain, _parameters); if (pProtocol == NULL) { FATAL("Unable to create protocol chain"); CLOSE_SOCKET(fd); return false; } //5. Create the carrier and bind it TCPCarrier *pTCPCarrier = new TCPCarrier(fd); pTCPCarrier->SetProtocol(pProtocol->GetFarEndpoint()); pProtocol->GetFarEndpoint()->SetIOHandler(pTCPCarrier); //6. Register the protocol stack with an application if (_pApplication != NULL) { pProtocol = pProtocol->GetNearEndpoint(); pProtocol->SetApplication(_pApplication); } if (pProtocol->GetNearEndpoint()->GetOutputBuffer() != NULL) pProtocol->GetNearEndpoint()->EnqueueForOutbound(); _acceptedCount++; //7. Done return true; }