Endil

cn-lab3-server

Oct 29th, 2015
91
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.31 KB | None | 0 0
  1. // cn-lab3-server.cpp: определяет точку входа для консольного приложения.
  2. //
  3.  
  4. #include "stdafx.h"
  5. #include <winsock2.h>
  6. #include <iostream>
  7. #include <thread>
  8. #include <string>
  9. #include <vector>
  10. #include <set>
  11.  
  12. #pragma comment(lib, "ws2_32.lib")
  13.  
  14. using namespace std;
  15.  
  16. vector<thread> clients;
  17. set<SOCKET> open_socks;
  18.  
  19. int client_process(const SOCKET client_sock, const int client_id) {
  20.     for (int request_id = 1;; request_id++) {
  21.         char recv_buff[1024];
  22.         int len = recv(client_sock, &recv_buff[0], sizeof(recv_buff) - 1, 0);
  23.         if (len == -1) {
  24.             cout << "Client " << client_id << " was closed" << endl;
  25.             return 1;
  26.         }
  27.         recv_buff[len] = '\0';
  28.         string s = recv_buff;
  29.         if (s == "&close")
  30.             break;
  31.         cout << "Received request " << request_id << " from client " << client_id << endl;
  32.         if (s.length() % 4 == 0)
  33.             s = s.substr(s.length() / 2, s.length()) + s.substr(0, s.length() / 2);
  34.         send(client_sock, s.c_str(), s.length(), 0);
  35.         cout << "Sent answer for request " << request_id << " to client " << client_id << endl;
  36.     }
  37.     closesocket(client_sock);
  38.     open_socks.erase(client_sock);
  39.     cout << "Client " << client_id << " disconnected" << endl;
  40.     return 0;
  41. }
  42.  
  43. int port_listen(const SOCKET &main_sock) {
  44.     for (int client_id = 1;; client_id++) {
  45.         sockaddr_in addr_client;
  46.         int client_addr_size = sizeof(addr_client);
  47.         SOCKET client_sock = accept(main_sock, (sockaddr *)&addr_client, &client_addr_size);
  48.         if (client_sock == INVALID_SOCKET) {
  49.             int wsa_error = WSAGetLastError();
  50.             if (wsa_error != 10004)
  51.                 cout << "Accept error " << wsa_error << endl;
  52.             return 1;
  53.         }
  54.         cout << "Client " << client_id << " connected" << endl;
  55.         clients.push_back(thread(client_process, client_sock, client_id));
  56.         open_socks.insert(client_sock);
  57.     }
  58.     return 0;
  59. }
  60.  
  61. int _tmain(int argc, _TCHAR* argv[])
  62. {
  63.     cout << "cn-lab3 var10 server start" << endl;
  64.     WSAData wsadata;
  65.     WSAStartup(0x0202, &wsadata);
  66.     cout << "WinSock2 initialized" << endl;
  67.     SOCKET main_sock;
  68.     main_sock = socket(AF_INET, SOCK_STREAM, 0);
  69.     if (main_sock == INVALID_SOCKET) {
  70.         cout << "Main socket create error " << WSAGetLastError() << endl;
  71.         WSACleanup();
  72.         return 1;
  73.     }
  74.     cout << "Main socket created successfully" << endl;
  75.     sockaddr_in addr_local;
  76.     addr_local.sin_family = AF_INET;
  77.     addr_local.sin_addr.S_un.S_addr = 0;
  78.     addr_local.sin_port = htons(5001);
  79.     if (::bind(main_sock, (sockaddr *)&addr_local, sizeof(addr_local))) {
  80.         cout << "Bind error " << WSAGetLastError() << endl;
  81.         closesocket(main_sock);
  82.         WSACleanup();
  83.         return 2;
  84.     }
  85.     cout << "Port " << ntohs(addr_local.sin_port) << " bound successful" << endl;
  86.     if (listen(main_sock, 16))
  87.     {
  88.         cout << "Listen error " << WSAGetLastError() << endl;
  89.         closesocket(main_sock);
  90.         WSACleanup();
  91.         return  3;
  92.     }
  93.     cout << "Listening port 5001" << endl;
  94.     thread listen(port_listen, main_sock);
  95.     string s;
  96.     do {
  97.         cin >> s;
  98.     } while (s != "stop" && s != "exit");
  99.     closesocket(main_sock);
  100.     if (listen.joinable())
  101.         listen.join();
  102.     for (auto client_sock : open_socks) {
  103.         send(client_sock, "&stop", sizeof("&stop"), 0);
  104.         closesocket(client_sock);
  105.     }
  106.     for (unsigned int i = 0; i < clients.size(); i++)
  107.         if (clients[i].joinable())
  108.             clients[i].join();
  109.     WSACleanup();
  110.     cout << "cn-lab1 var10 server stopped" << endl;
  111.     return 0;
  112. }
Advertisement
Add Comment
Please, Sign In to add comment