Advertisement
filip710

LV4 - MultipleClientServer

May 13th, 2019
130
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.16 KB | None | 0 0
  1. #include <iostream>
  2. #include <WS2tcpip.h>
  3. #include <string>
  4. #include <sstream>
  5.  
  6. #pragma comment (lib, "ws2_32.lib")
  7.  
  8. #define NMAXCLIENTS 4
  9.  
  10. int main()
  11. {
  12.     WSADATA wsData;
  13.     WORD ver = MAKEWORD(2, 2);
  14.  
  15.     int wsOk = WSAStartup(ver, &wsData);
  16.     if (wsOk != 0)
  17.     {
  18.         std::cerr << "Error initializing winsock. Bye." << std::endl;
  19.         return -1;
  20.     }
  21.  
  22.     SOCKET listening = socket(AF_INET, SOCK_STREAM, 0);
  23.     if (listening == INVALID_SOCKET)
  24.     {
  25.         std::cerr << "Error initializing a socket! Bye." << std::endl;
  26.         return -2;
  27.     }
  28.  
  29.     sockaddr_in hint;
  30.     hint.sin_family = AF_INET;
  31.     hint.sin_port = htons(54000);
  32.     hint.sin_addr.S_un.S_addr = INADDR_ANY;
  33.  
  34.     bind(listening, (sockaddr*)&hint, sizeof(hint));
  35.  
  36.     listen(listening, NMAXCLIENTS);
  37.  
  38.     std::cout << "Server up and running." << std::endl << "Waiting for clients to connect..." << std::endl;
  39.  
  40.     fd_set master;
  41.     FD_ZERO(&master);
  42.  
  43.     FD_SET(listening, &master);
  44.  
  45.     int numOfClients = 0;
  46.     bool running = true;
  47.  
  48.     while (running)
  49.     {
  50.         fd_set copy = master;
  51.         int socketCount = select(0, &copy, nullptr, nullptr, nullptr);
  52.  
  53.         for (int i = 0; i < socketCount; i++)
  54.         {
  55.             SOCKET sock = copy.fd_array[i];
  56.  
  57.             // Inbound connection
  58.             if (sock == listening)
  59.             {
  60.                 SOCKET client = accept(listening, nullptr, nullptr);
  61.                 FD_SET(client, &master);
  62.                 numOfClients++;
  63.  
  64.                 std::string welcomeMsg = "Connected to the server!\r\n";
  65.                 send(client, welcomeMsg.c_str(), welcomeMsg.size() + 1, 0);
  66.                 std::cout << "Number of clients connected: " << numOfClients << "\r\n";
  67.             }
  68.             // Inbound message
  69.             else
  70.             {
  71.                 char buf[4096];
  72.                 ZeroMemory(buf, 4096);
  73.  
  74.                 // Receive message
  75.                 int bytesIn = recv(sock, buf, 4096, 0);
  76.                 std::cout << "Socket #" << sock << ": " << buf << "\r\n";
  77.                 if (bytesIn <= 0)
  78.                 {
  79.                     closesocket(sock);
  80.                     FD_CLR(sock, &master);
  81.                     numOfClients--;
  82.                     std::cout << "Number of clients connected: " << numOfClients << "\r\n";
  83.                 }
  84.                 else
  85.                 {
  86.                     if (buf[0] == 'N')
  87.                     {
  88.                         std::string name = std::string(buf, bytesIn);
  89.                         std::ostringstream clientNumMessageStream;
  90.                         clientNumMessageStream << "B" << numOfClients << "\r\n";
  91.                         std::string clientNumMessage = clientNumMessageStream.str();
  92.                         send(sock, clientNumMessage.c_str(), clientNumMessage.size() + 1, 0);
  93.                     }
  94.  
  95.                     // Send message to other clients
  96.                     if (numOfClients == NMAXCLIENTS) {
  97.                         for (int i = 0; i < master.fd_count; i++)
  98.                         {
  99.                             SOCKET outSock = master.fd_array[i];
  100.                             if (outSock != listening)
  101.                             {
  102.                                 std::string strOut = "P";
  103.                                 send(outSock, strOut.c_str(), strOut.size() + 1, 0);
  104.                             }
  105.                         }
  106.                     }
  107.  
  108.                     else if (numOfClients > NMAXCLIENTS) {
  109.                         std::cout << "Max client count exceeded, shutting down the server..." << std::endl;
  110.                         running = false;
  111.                         break;
  112.                     }
  113.                 }
  114.             }
  115.         }
  116.     }
  117.  
  118.     FD_CLR(listening, &master);
  119.     closesocket(listening);
  120.  
  121.     std::string msg = "Server is shutting down...\r\n";
  122.  
  123.     while (master.fd_count > 0)
  124.     {
  125.         SOCKET sock = master.fd_array[0];
  126.         send(sock, msg.c_str(), msg.size() + 1, 0);
  127.         FD_CLR(sock, &master);
  128.         closesocket(sock);
  129.     }
  130.  
  131.     WSACleanup();
  132.  
  133.     system("pause");
  134.     return 0;
  135. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement