/** ** Open a TCP socket ** ** @param port Bind socket to a specific port number ** ** @return If success the socket fildes, -1 otherwise */ Socket NetOpenTCP(const char *addr, int port) { Socket sockfd = socket(AF_INET, SOCK_STREAM, 0); if (sockfd == INVALID_SOCKET) { return static_cast<Socket>(-1); } // bind local port if (port) { struct sockaddr_in sock_addr; memset(&sock_addr, 0, sizeof(sock_addr)); sock_addr.sin_family = AF_INET; if (addr) { sock_addr.sin_addr.s_addr = inet_addr(addr); } else { sock_addr.sin_addr.s_addr = INADDR_ANY; } sock_addr.sin_port = htons(port); int opt = 1; setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, (setsockopttype)&opt, sizeof(opt)); if (bind(sockfd, (struct sockaddr *)&sock_addr, sizeof(sock_addr)) < 0) { fprintf(stderr, "Couldn't bind to local port\n"); NetCloseTCP(sockfd); return static_cast<Socket>(-1); } } return sockfd; }
/** ** Open a TCP socket ** ** @param port Bind socket to a specific port number ** ** @return If success the socket fildes, -1 otherwise */ Socket NetOpenTCP(int port) { Socket sockfd; sockfd = socket(AF_INET, SOCK_STREAM, 0); if (sockfd == INVALID_SOCKET) { return (Socket)-1; } // bind local port if (port) { struct sockaddr_in sock_addr; int opt; memset(&sock_addr, 0, sizeof(sock_addr)); sock_addr.sin_family = AF_INET; sock_addr.sin_addr.s_addr = INADDR_ANY; sock_addr.sin_port = htons(port); opt = 1; setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, (setsockopttype)&opt, sizeof(opt)); if (bind(sockfd,(struct sockaddr *)&sock_addr, sizeof(sock_addr)) < 0) { fprintf(stderr, "Couldn't bind to local port\n"); NetCloseTCP(sockfd); return (Socket)-1; } NetLastHost = sock_addr.sin_addr.s_addr; NetLastPort = sock_addr.sin_port; } NetLastSocket = sockfd; return sockfd; }
void CheckForConnection() { Socket newSocket = NetAcceptTCP(listeningSocket); if (newSocket != INVALID_SOCKET) { if (connected) { SendResponseMessage("New connection made. Goodbye.\n", 3); NetCloseTCP(interfaceSocket); } interfaceSocket = newSocket; DebugPrint("Established socket interface connection to %d.%d.%d.%d port %d\n" _C_ NIPQUAD(ntohl(NetLastHost)) _C_ NetLastPort); NetSetNonBlocking(interfaceSocket); connected = true; } }
void CheckForCommands() { int result = strlen(recv_buffer); if (result == 0) // No pending commands { // Keep going till the commands have been received completely (the last character is an endline; recv_buffer better be big enough for at least one entire command) do { memset(temp_buffer, 0, RECV_BUFFER_SIZE); result = NetRecvTCP(interfaceSocket, temp_buffer, RECV_BUFFER_SIZE - strlen(recv_buffer) - 1); if (result > 0) strcat(recv_buffer, temp_buffer); } while (result > 0 && (strlen(recv_buffer) > 0 && strlen(recv_buffer) < RECV_BUFFER_SIZE - 1 && recv_buffer[strlen(recv_buffer) - 1] != '\n')); } if (result > 0) HandleRequest(); else if (NetCheckForDisconnect()) { DebugPrint("Broken connection."); connected = false; NetCloseTCP(interfaceSocket); } }
void Close() { NetCloseTCP(socket); socket = Socket(-1); }
void SocketInterfaceExit() { if (connected) NetCloseTCP(interfaceSocket); NetCloseTCP(listeningSocket); }
void HandleQuit() { SendResponseMessage("BYE\n", 3); connected = false; NetCloseTCP(interfaceSocket); }
/** ** Close Connection to Master Server ** ** @return nothing */ int MetaClose() { NetCloseTCP(MetaServerFildes); return 0; }