Guest User

Untitled

a guest
Jan 17th, 2018
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.58 KB | None | 0 0
  1. std::string linHttpHandler::send(const std::string & msg, const std::string & adr, int port) const
  2. {
  3. // create socket
  4. int socketFD = socket(AF_INET, SOCK_STREAM, 0);
  5.  
  6. SocketCloser closeMySocket(socketFD);
  7. if (socketFD < 0)
  8. {
  9. std::cerr << "linHttpHandler: Failed to open socketn";
  10. throw(std::runtime_error("linHttpHandler: Failed to open socket"));
  11. }
  12.  
  13. // lookup ip address
  14. hostent *server;
  15. server = gethostbyname(adr.c_str());
  16. if (server == NULL)
  17. {
  18. std::cerr << "linHttpHandler: Failed to find host with address " << adr << "n";
  19. throw(std::runtime_error("linHttpHandler: Failed to find host"));
  20. }
  21.  
  22. // fill in the structure
  23. sockaddr_in server_addr;
  24. memset(&server_addr, 0, sizeof(server_addr));
  25. server_addr.sin_family = AF_INET;
  26. server_addr.sin_port = htons(port);
  27. memcpy(&server_addr.sin_addr.s_addr, server->h_addr, server->h_length);
  28.  
  29. // connect the socket
  30. if (connect(socketFD, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0)
  31. {
  32. std::cerr << "linHttpHandler: Failed to connect socketn";
  33. throw(std::runtime_error("linHttpHandler: Failed to connect socket"));
  34. }
  35.  
  36. // send the request
  37. size_t total = msg.length();
  38. ssize_t sent = 0;
  39. do
  40. {
  41. ssize_t bytes = write(socketFD, msg.c_str() + sent, total - sent);
  42. if (bytes < 0)
  43. {
  44. std::cerr << "linHttpHandler: Failed to write message to socketn";
  45. throw(std::runtime_error("linHttpHandler: Failed to write message to socket"));
  46. }
  47. if (bytes == 0)
  48. {
  49. break;
  50. }
  51. if (bytes)
  52. {
  53. sent += bytes;
  54. }
  55. } while (sent < total);
  56.  
  57. // receive the response
  58. std::string response;
  59. total = sizeof(response) - 1;
  60. int received = 0;
  61. char buffer[128] = {};
  62. do
  63. {
  64. ssize_t bytes = read(socketFD, buffer, 127);
  65. if (bytes < 0)
  66. {
  67. std::cerr << "linHttpHandler: Failed to read response from socket: " << errno << std::endl;
  68. throw(std::runtime_error("linHttpHandler: Failed to read response from socket"));
  69. }
  70. if (bytes == 0)
  71. {
  72. break;
  73. }
  74. if (bytes)
  75. {
  76. received += bytes;
  77. response.append(buffer, bytes);
  78. }
  79. } while (true);
  80.  
  81. if (received == total)
  82. {
  83. std::cerr << "linHttpHandler: Failed to store complete response from socketn";
  84. throw(std::runtime_error("linHttpHandler: Failed to store complete response from socket"));
  85. }
  86.  
  87. return response;
  88. }
Add Comment
Please, Sign In to add comment