skindervik

TCP-MULTI-THREADED-CLIENT

Jul 4th, 2020
375
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.51 KB | None | 0 0
  1. #include<iostream>
  2. #include<WS2tcpip.h>
  3. #include<sstream>
  4. #include<thread>
  5. #pragma comment (lib, "Ws2_32.lib")
  6. int main() {
  7.     //INITIALIZE WINSOCK
  8.     WSADATA some_kind_of_data;
  9.     WSAStartup(MAKEWORD(2,2), &some_kind_of_data);
  10.  
  11.     //CREATE CONNECTION SOCKET
  12.     sockaddr_in connect_adress;
  13.     connect_adress.sin_family = AF_INET;
  14.     connect_adress.sin_port = htons(666);
  15.     inet_pton(AF_INET, "127.0.0.1", &connect_adress.sin_addr);
  16.     SOCKET connection_socket = socket(AF_INET, SOCK_STREAM, 0);
  17.  
  18.     //CONNECT TO SERVER - THREAD 01
  19.     bool is_connected = false;
  20.  
  21.     std::thread connector([&connection_socket,&connect_adress,&is_connected]() {
  22.         while (true){
  23.             //TRY SENDING MESSAGE TO SEE IF ITS CONNECTED
  24.             if (send(connection_socket, "", 1, 0) == SOCKET_ERROR) {
  25.                 //IF NOT CONNECTED :
  26.                 is_connected = false;
  27.                 //RESET THE CONNECTION SOCKET
  28.                 connection_socket = socket(AF_INET, SOCK_STREAM, 0);
  29.                 //TRY TO CONNECT TO THE SERVER, IN A LOOP
  30.                 while (true){
  31.                     std::cout << "Trying to connect to server...\n";
  32.                     if (connect(connection_socket, (sockaddr*)&connect_adress, sizeof(connect_adress)) != SOCKET_ERROR) {
  33.                         //IF IT CONNECTS TO THE SERVER
  34.                         std::cout << "Connected to server!\n";
  35.                         is_connected = true;
  36.                         //GOES BACK TO SENDING MESSAGES TO SEE IF ITS STILL CONNECTED
  37.                         break;
  38.                     }}}
  39.             //SLEEP FOR ONE SECOND
  40.             std::this_thread::sleep_for(std::chrono::seconds(1));
  41.             }});
  42.  
  43.     //RECEIVE MESSAGES FROM SERVER - THREAD 02
  44.     std::thread receiver([&connection_socket, &is_connected]() {
  45.         //STORE RECEIVED MESSAGE INSIDE THIS BUFFER
  46.         char buffer[1024];
  47.         while (true) {
  48.             if (is_connected == true) {
  49.                 //RESET BUFFER EVERY TIME
  50.                 memset(buffer, 0, sizeof(buffer));
  51.                 //IF MESSAGE RECEIVED IS LONGER THEN ONE BYTE, PRINT IT OUT
  52.                 if (recv(connection_socket, buffer, sizeof(buffer), 0) > 1)
  53.                     std::cout << buffer << std::endl;
  54.             }
  55.             //SLEEP FOR 1S IF NOT CONNECTED
  56.             else std::this_thread::sleep_for(std::chrono::seconds(1));
  57.             }});
  58.  
  59.     //SEND A MESSAGES - MAIN THREAD
  60.     std::string msg;
  61.    
  62.     while (true) {
  63.         if (is_connected == true){
  64.             //ASK USER TO TYPE THE MESSAGE
  65.             std::getline(std::cin, msg);
  66.             //SEND THE MESSAGE
  67.             if (send(connection_socket, msg.c_str(), msg.size() + 1, 0) <= 0)
  68.                 //IF IT FAILS TO SEND THE MESSAGE
  69.                 std::cout << "Failed to send the message...\n";
  70.         }
  71.         //SLEEP FOR 1S IF SOCKET IS NOT CONNECTED
  72.         else std::this_thread::sleep_for(std::chrono::seconds(1));
  73.     }
  74.  
  75.     closesocket(connection_socket);
  76.     WSACleanup();
  77.     quick_exit(0);
  78. }
Add Comment
Please, Sign In to add comment