Advertisement
Vlad3955

TCPclient.cpp

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