bool SocketServer::tryBind(unsigned short port, const char * intface) { struct sockaddr_in servaddr; memset(&servaddr, 0, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_addr.s_addr = htonl(INADDR_ANY); servaddr.sin_port = htons(port); if(intface != 0){ if(Ndb_getInAddr(&servaddr.sin_addr, intface)) return false; } const NDB_SOCKET_TYPE sock = my_socket_create(AF_INET, SOCK_STREAM, 0); if (!my_socket_valid(sock)) return false; DBUG_PRINT("info",("NDB_SOCKET: " MY_SOCKET_FORMAT, MY_SOCKET_FORMAT_VALUE(sock))); if (my_socket_reuseaddr(sock, true) == -1) { NDB_CLOSE_SOCKET(sock); return false; } if (my_bind_inet(sock, &servaddr) == -1) { NDB_CLOSE_SOCKET(sock); return false; } NDB_CLOSE_SOCKET(sock); return true; }
bool SocketClient::init() { if (my_socket_valid(m_sockfd)) NDB_CLOSE_SOCKET(m_sockfd); if (m_server_name) { memset(&m_servaddr, 0, sizeof(m_servaddr)); m_servaddr.sin_family = AF_INET; m_servaddr.sin_port = htons(m_port); // Convert ip address presentation format to numeric format if (Ndb_getInAddr(&m_servaddr.sin_addr, m_server_name)) return false; } m_sockfd= my_socket_create(AF_INET, SOCK_STREAM, 0); if (!my_socket_valid(m_sockfd)) { return false; } DBUG_PRINT("info",("NDB_SOCKET: " MY_SOCKET_FORMAT, MY_SOCKET_FORMAT_VALUE(m_sockfd))); return true; }
bool Transporter::connect_client(NDB_SOCKET_TYPE sockfd) { DBUG_ENTER("Transporter::connect_client(sockfd)"); if(m_connected) { DBUG_PRINT("error", ("Already connected")); DBUG_RETURN(true); } if (!my_socket_valid(sockfd)) { DBUG_PRINT("error", ("Socket " MY_SOCKET_FORMAT " is not valid", MY_SOCKET_FORMAT_VALUE(sockfd))); DBUG_RETURN(false); } DBUG_PRINT("info",("server port: %d, isMgmConnection: %d", m_s_port, isMgmConnection)); // Send "hello" DBUG_PRINT("info", ("Sending own nodeid: %d and transporter type: %d", localNodeId, m_type)); SocketOutputStream s_output(sockfd); if (s_output.println("%d %d", localNodeId, m_type) < 0) { DBUG_PRINT("error", ("Send of 'hello' failed")); NDB_CLOSE_SOCKET(sockfd); DBUG_RETURN(false); } // Read reply DBUG_PRINT("info", ("Reading reply")); char buf[256]; SocketInputStream s_input(sockfd); if (s_input.gets(buf, 256) == 0) { DBUG_PRINT("error", ("Failed to read reply")); NDB_CLOSE_SOCKET(sockfd); DBUG_RETURN(false); } // Parse reply int nodeId, remote_transporter_type= -1; int r= sscanf(buf, "%d %d", &nodeId, &remote_transporter_type); switch (r) { case 2: break; case 1: // we're running version prior to 4.1.9 // ok, but with no checks on transporter configuration compatability break; default: DBUG_PRINT("error", ("Failed to parse reply")); NDB_CLOSE_SOCKET(sockfd); DBUG_RETURN(false); } DBUG_PRINT("info", ("nodeId=%d remote_transporter_type=%d", nodeId, remote_transporter_type)); // Check nodeid if (nodeId != remoteNodeId) { g_eventLogger->error("Connected to wrong nodeid: %d, expected: %d", nodeId, remoteNodeId); NDB_CLOSE_SOCKET(sockfd); DBUG_RETURN(false); } // Check transporter type if (remote_transporter_type != -1 && remote_transporter_type != m_type) { g_eventLogger->error("Connection to node: %d uses different transporter " "type: %d, expected type: %d", nodeId, remote_transporter_type, m_type); NDB_CLOSE_SOCKET(sockfd); DBUG_RETURN(false); } // Cache the connect address my_socket_connect_address(sockfd, &m_connect_address); if (!connect_client_impl(sockfd)) DBUG_RETURN(false); m_connected = true; DBUG_RETURN(true); }
bool SocketServer::setup(SocketServer::Service * service, unsigned short * port, const char * intface){ DBUG_ENTER("SocketServer::setup"); DBUG_PRINT("enter",("interface=%s, port=%u", intface, *port)); struct sockaddr_in servaddr; memset(&servaddr, 0, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_addr.s_addr = htonl(INADDR_ANY); servaddr.sin_port = htons(*port); if(intface != 0){ if(Ndb_getInAddr(&servaddr.sin_addr, intface)) DBUG_RETURN(false); } const NDB_SOCKET_TYPE sock = my_socket_create(AF_INET, SOCK_STREAM, 0); if (!my_socket_valid(sock)) { DBUG_PRINT("error",("socket() - %d - %s", socket_errno, strerror(socket_errno))); DBUG_RETURN(false); } DBUG_PRINT("info",("NDB_SOCKET: " MY_SOCKET_FORMAT, MY_SOCKET_FORMAT_VALUE(sock))); if (my_socket_reuseaddr(sock, true) == -1) { DBUG_PRINT("error",("setsockopt() - %d - %s", errno, strerror(errno))); NDB_CLOSE_SOCKET(sock); DBUG_RETURN(false); } if (my_bind_inet(sock, &servaddr) == -1) { DBUG_PRINT("error",("bind() - %d - %s", socket_errno, strerror(socket_errno))); NDB_CLOSE_SOCKET(sock); DBUG_RETURN(false); } /* Get the port we bound to */ if(my_socket_get_port(sock, port)) { ndbout_c("An error occurred while trying to find out what" " port we bound to. Error: %d - %s", socket_errno, strerror(socket_errno)); my_socket_close(sock); DBUG_RETURN(false); } DBUG_PRINT("info",("bound to %u", *port)); if (my_listen(sock, m_maxSessions > 32 ? 32 : m_maxSessions) == -1) { DBUG_PRINT("error",("listen() - %d - %s", socket_errno, strerror(socket_errno))); my_socket_close(sock); DBUG_RETURN(false); } ServiceInstance i; i.m_socket = sock; i.m_service = service; m_services.push_back(i); // Increase size to allow polling all listening ports m_services_poller.set_max_count(m_services.size()); DBUG_RETURN(true); }