Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- std::string linHttpHandler::send(const std::string & msg, const std::string & adr, int port) const
- {
- // create socket
- int socketFD = socket(AF_INET, SOCK_STREAM, 0);
- SocketCloser closeMySocket(socketFD);
- if (socketFD < 0)
- {
- std::cerr << "linHttpHandler: Failed to open socketn";
- throw(std::runtime_error("linHttpHandler: Failed to open socket"));
- }
- // lookup ip address
- hostent *server;
- server = gethostbyname(adr.c_str());
- if (server == NULL)
- {
- std::cerr << "linHttpHandler: Failed to find host with address " << adr << "n";
- throw(std::runtime_error("linHttpHandler: Failed to find host"));
- }
- // fill in the structure
- sockaddr_in server_addr;
- memset(&server_addr, 0, sizeof(server_addr));
- server_addr.sin_family = AF_INET;
- server_addr.sin_port = htons(port);
- memcpy(&server_addr.sin_addr.s_addr, server->h_addr, server->h_length);
- // connect the socket
- if (connect(socketFD, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0)
- {
- std::cerr << "linHttpHandler: Failed to connect socketn";
- throw(std::runtime_error("linHttpHandler: Failed to connect socket"));
- }
- // send the request
- size_t total = msg.length();
- ssize_t sent = 0;
- do
- {
- ssize_t bytes = write(socketFD, msg.c_str() + sent, total - sent);
- if (bytes < 0)
- {
- std::cerr << "linHttpHandler: Failed to write message to socketn";
- throw(std::runtime_error("linHttpHandler: Failed to write message to socket"));
- }
- if (bytes == 0)
- {
- break;
- }
- if (bytes)
- {
- sent += bytes;
- }
- } while (sent < total);
- // receive the response
- std::string response;
- total = sizeof(response) - 1;
- int received = 0;
- char buffer[128] = {};
- do
- {
- ssize_t bytes = read(socketFD, buffer, 127);
- if (bytes < 0)
- {
- std::cerr << "linHttpHandler: Failed to read response from socket: " << errno << std::endl;
- throw(std::runtime_error("linHttpHandler: Failed to read response from socket"));
- }
- if (bytes == 0)
- {
- break;
- }
- if (bytes)
- {
- received += bytes;
- response.append(buffer, bytes);
- }
- } while (true);
- if (received == total)
- {
- std::cerr << "linHttpHandler: Failed to store complete response from socketn";
- throw(std::runtime_error("linHttpHandler: Failed to store complete response from socket"));
- }
- return response;
- }
Add Comment
Please, Sign In to add comment