Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // cn-lab3-server.cpp: определяет точку входа для консольного приложения.
- //
- #include "stdafx.h"
- #include <winsock2.h>
- #include <iostream>
- #include <thread>
- #include <string>
- #include <vector>
- #include <set>
- #pragma comment(lib, "ws2_32.lib")
- using namespace std;
- vector<thread> clients;
- set<SOCKET> open_socks;
- int client_process(const SOCKET client_sock, const int client_id) {
- for (int request_id = 1;; request_id++) {
- char recv_buff[1024];
- int len = recv(client_sock, &recv_buff[0], sizeof(recv_buff) - 1, 0);
- if (len == -1) {
- cout << "Client " << client_id << " was closed" << endl;
- return 1;
- }
- recv_buff[len] = '\0';
- string s = recv_buff;
- if (s == "&close")
- break;
- cout << "Received request " << request_id << " from client " << client_id << endl;
- if (s.length() % 4 == 0)
- s = s.substr(s.length() / 2, s.length()) + s.substr(0, s.length() / 2);
- send(client_sock, s.c_str(), s.length(), 0);
- cout << "Sent answer for request " << request_id << " to client " << client_id << endl;
- }
- closesocket(client_sock);
- open_socks.erase(client_sock);
- cout << "Client " << client_id << " disconnected" << endl;
- return 0;
- }
- int port_listen(const SOCKET &main_sock) {
- for (int client_id = 1;; client_id++) {
- sockaddr_in addr_client;
- int client_addr_size = sizeof(addr_client);
- SOCKET client_sock = accept(main_sock, (sockaddr *)&addr_client, &client_addr_size);
- if (client_sock == INVALID_SOCKET) {
- int wsa_error = WSAGetLastError();
- if (wsa_error != 10004)
- cout << "Accept error " << wsa_error << endl;
- return 1;
- }
- cout << "Client " << client_id << " connected" << endl;
- clients.push_back(thread(client_process, client_sock, client_id));
- open_socks.insert(client_sock);
- }
- return 0;
- }
- int _tmain(int argc, _TCHAR* argv[])
- {
- cout << "cn-lab3 var10 server start" << endl;
- WSAData wsadata;
- WSAStartup(0x0202, &wsadata);
- cout << "WinSock2 initialized" << endl;
- SOCKET main_sock;
- main_sock = socket(AF_INET, SOCK_STREAM, 0);
- if (main_sock == INVALID_SOCKET) {
- cout << "Main socket create error " << WSAGetLastError() << endl;
- WSACleanup();
- return 1;
- }
- cout << "Main socket created successfully" << endl;
- sockaddr_in addr_local;
- addr_local.sin_family = AF_INET;
- addr_local.sin_addr.S_un.S_addr = 0;
- addr_local.sin_port = htons(5001);
- if (::bind(main_sock, (sockaddr *)&addr_local, sizeof(addr_local))) {
- cout << "Bind error " << WSAGetLastError() << endl;
- closesocket(main_sock);
- WSACleanup();
- return 2;
- }
- cout << "Port " << ntohs(addr_local.sin_port) << " bound successful" << endl;
- if (listen(main_sock, 16))
- {
- cout << "Listen error " << WSAGetLastError() << endl;
- closesocket(main_sock);
- WSACleanup();
- return 3;
- }
- cout << "Listening port 5001" << endl;
- thread listen(port_listen, main_sock);
- string s;
- do {
- cin >> s;
- } while (s != "stop" && s != "exit");
- closesocket(main_sock);
- if (listen.joinable())
- listen.join();
- for (auto client_sock : open_socks) {
- send(client_sock, "&stop", sizeof("&stop"), 0);
- closesocket(client_sock);
- }
- for (unsigned int i = 0; i < clients.size(); i++)
- if (clients[i].joinable())
- clients[i].join();
- WSACleanup();
- cout << "cn-lab1 var10 server stopped" << endl;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment