Advertisement
Vlad3955

tcp_client.cpp

Nov 12th, 2022
953
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.35 KB | None | 0 0
  1. #include <iostream>
  2. #include <algorithm>
  3. #include <cstdlib>
  4. #include <cassert>
  5. #include <iomanip>
  6. #include <iostream>
  7. #include <string>
  8. #include <cstring>
  9. #include <vector>
  10. #include <filesystem>
  11. #include <fstream>
  12.  
  13. #include <socket_wrapper/socket_headers.h>
  14. #include <socket_wrapper/socket_wrapper.h>
  15. #include <socket_wrapper/socket_class.h>
  16.  
  17.  
  18.  
  19.  
  20. // Trim from end (in place).
  21. static inline std::string& rtrim(std::string& s)
  22. {
  23.     s.erase(std::find_if(s.rbegin(), s.rend(), [](int c) { return !std::isspace(c); }).base());
  24.     return s;
  25. }
  26.  
  27.  
  28.  
  29. int main(int argc, char const* argv[])
  30. //int main()
  31. {
  32.  
  33.     if (argc != 2)
  34.     {
  35.         std::cout << "Usage: " << argv[0] << " <port>" << std::endl;
  36.         return EXIT_FAILURE;
  37.     }
  38.  
  39.     const int port{ std::stoi(argv[1]) };
  40.     //const int port{ std::stoi("15234")};
  41.     socket_wrapper::SocketWrapper sock_wrap;
  42.    
  43.  
  44.  
  45.     std::cout << "Starting TCP-client on the port " << port << "...\n";
  46.  
  47.  
  48.     addrinfo hints =
  49.     {
  50.         .ai_family = AF_INET,
  51.         .ai_socktype = SOCK_STREAM,
  52.         .ai_protocol = IPPROTO_TCP
  53.     };
  54.  
  55.     addrinfo* s_i = nullptr;
  56.     int status = 0;
  57.  
  58.     if ((status = getaddrinfo(NULL, std::to_string(port).c_str(), &hints, &s_i)) != 0)
  59.     {
  60.         std::string msg{ "getaddrinfo error: " };
  61.         msg += gai_strerror(status);
  62.         std::cout << msg;
  63.         exit(EXIT_FAILURE);
  64.     }
  65.  
  66.     std::unique_ptr<addrinfo, decltype(&freeaddrinfo)> servinfo{ s_i, freeaddrinfo };
  67.  
  68.     for (auto const* s = servinfo.get(); s != nullptr; s = s->ai_next)
  69.     {
  70.  
  71.         assert(s->ai_family == s->ai_addr->sa_family);
  72.         if (AF_INET == s->ai_family)
  73.         {
  74.             char ip[INET_ADDRSTRLEN];
  75.  
  76.             sockaddr_in* const sin = reinterpret_cast<sockaddr_in* const>(s->ai_addr);
  77.             sin->sin_family = AF_INET;
  78.             sin->sin_port = htons(port);
  79.             //sin->sin_addr.s_addr = INADDR_ANY; // not working
  80.             inet_pton(AF_INET, "10.0.2.15", &sin->sin_addr);
  81.  
  82.             socket_wrapper::Socket s = { AF_INET, SOCK_STREAM, IPPROTO_TCP };
  83.  
  84.             if (!s)
  85.             {
  86.                 std::cout << "socket error" << std::endl;
  87.                 exit(EXIT_FAILURE);
  88.             }
  89.  
  90.             if (connect(s, reinterpret_cast<const sockaddr*>(sin), sizeof(sockaddr_in)))
  91.             {
  92.                 std::cout << "Connect IPv4 error!" << std::endl;
  93.                 return EXIT_FAILURE;
  94.             }
  95.  
  96.             while (true)
  97.             {
  98.  
  99.                 char message[256];
  100.                 printf("Enter message: ");
  101.                 std::cin.getline(message, 256);
  102.  
  103.                 // send the message
  104.                 send(s, message, strlen(message), 0);
  105.  
  106.  
  107.                 std::vector<char> buffer;
  108.                 recv(s, &(buffer.data()[0]), buffer.size(), 0);
  109.  
  110.                 if (!buffer.empty())
  111.                 {
  112.                     std::fstream file;
  113.                     file.open(message, std::ios_base::out | std::ios_base::binary);
  114.  
  115.                     if (file.is_open())
  116.                     {
  117.                         std::cout << "Received file!" << std::endl;
  118.                         for (auto& b : buffer)
  119.                         {
  120.                             std::cout << b;
  121.                         }
  122.                         std::cout << std::endl;
  123.                         file.write(&buffer[0], buffer.size());
  124.                     }
  125.                 }
  126.             }
  127.  
  128.         }
  129.         else if (AF_INET6 == s->ai_family)
  130.         {
  131.             char ip6[INET6_ADDRSTRLEN];
  132.  
  133.             sockaddr_in6* const sin = reinterpret_cast<sockaddr_in6* const>(s->ai_addr);
  134.  
  135.             sin->sin6_family = AF_INET6;
  136.             sin->sin6_port = htons(port);
  137.             //sin->sin6_addr = in6addr_any; // not working
  138.             inet_pton(AF_INET6, "", &sin->sin6_addr);
  139.  
  140.             socket_wrapper::Socket s = { AF_INET6, SOCK_STREAM, IPPROTO_TCP };
  141.  
  142.             if (!s)
  143.             {
  144.                 std::cout << "Socket error!" << std::endl;
  145.                 exit(EXIT_FAILURE);
  146.             }
  147.  
  148.             if (connect(s, reinterpret_cast<const sockaddr*>(sin), sizeof(sockaddr_in6)) < 0)
  149.             {
  150.                 std::cout << "Connect IPv6 error!" << std::endl;
  151.                 return EXIT_FAILURE;
  152.             }
  153.  
  154.            
  155.  
  156.             while (true)
  157.             {
  158.  
  159.                 char message[256];
  160.                 printf("Enter message: ");
  161.                 std::cin.getline(message, 256);
  162.  
  163.                 // send the message
  164.                 send(s, message, strlen(message), 0);
  165.  
  166.  
  167.                 std::vector<char> buffer(256);
  168.                 recv(s, &(buffer.data()[0]), buffer.size(), 0);
  169.  
  170.                 if (!buffer.empty())
  171.                 {
  172.                     std::fstream file;
  173.                     file.open(message, std::ios_base::out | std::ios_base::binary);
  174.  
  175.                     if (file.is_open())
  176.                     {
  177.                         std::cout << "Received file!" << std::endl;
  178.                         for (auto& b : buffer)
  179.                         {
  180.                             std::cout << b;
  181.                         }
  182.                         std::cout << std::endl;
  183.                         file.write(&buffer[0], buffer.size());
  184.                     }
  185.                 }
  186.             }
  187.         }
  188.     }  // for
  189.  
  190.     return EXIT_SUCCESS;
  191. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement