#include "network.hpp" #include #include // Needed for exit() #include // Needed for strcpy() and strlen() #include void HandleClient(int browser_s, int server_s) { char in_buf[BUF_SIZE]; // Input buffer for GET resquest char out_buf[BUF_SIZE]; // Output buffer for HTML response ssize_t buf_len; // Buffer length for file reads // Pass GET along from browser to server std::cout << "Attempting to send to server" << std::endl; do { buf_len = recv(browser_s, in_buf, BUF_SIZE, 0); if (buf_len == -1) { std::cout << "ERROR - recv returned -1" << std::endl; std::terminate(); } send(server_s, in_buf, buf_len, 0); } while (buf_len != 0); std::cout << "Sent to server" << std::endl; // Pass response along from server to browser std::cout << "Attempting to send to browser" << std::endl; do { buf_len = recv(server_s, out_buf, BUF_SIZE, 0); send(browser_s, out_buf, buf_len, 0); } while (buf_len != 0); std::cout << "Sent to browser" << std::endl; close(server_s); close(browser_s); } Client::Client(void) { addressLength = sizeof(address); address.sin_family = AF_INET; } bool Client::ConnectFrom(int socketFD) { socketFD = accept(socketFD, (struct sockaddr *)&address, &addressLength); if (socketFD == -1) { return 1; } return 0; } bool Client::ConnectTo(int portNumber) { std::cout << "Attempting to connect to " << kWebserverIP << " on " << portNumber << std::endl; address.sin_port = htons(portNumber); if (inet_pton(address.sin_family, kWebserverIP, &address.sin_addr) <= 0) { std::cerr << "ERROR (info) - inet_pton" << std::endl; return 1; } socketFD = socket(address.sin_family, SOCK_STREAM, 0); if (connect(socketFD, (struct sockaddr *)&address, addressLength) == -1) { std::cerr << "ERROR (info) - connect" << std::endl; return 1; } std::cout << "Connection successful" << std::endl; return 0; } Server::Server(int portNumber) { address.sin_family = AF_INET; address.sin_port = htons(portNumber); address.sin_addr.s_addr = htonl(INADDR_ANY); } void Server::Open(void) { std::cout << "Opening the server" << std::endl; // Create a socket, fill-in address information, and then bind it socketFD = socket(address.sin_family, SOCK_STREAM, 0); if (socketFD == -1) { std::cerr << "ERROR - Unable to create socket on server" << std::endl; exit(1); } if (bind(socketFD, (struct sockaddr *)&address, sizeof(address)) == -1) { std::cerr << "ERROR - Unable to bind socket" << std::endl; exit(1); } // Listen for connections and then accept listen(socketFD, 100); } void Server::Close(void) { std::cout << "Closing the server" << std::endl; close(socketFD); }