Доработать чат, пример которого приведен ниже.
Добавить возможность получать сообщения от нескольких клиентов. Если в течении 2-х минут сообщение от какого-то клиента не поступило, сервер должен отсоединить его.

Код:

Socket.h
"#pragma once
#include <iostream>
#include "WinSock2.h"
#include <ws2tcpip.h>
#pragma comment(lib,"Ws2_32.lib")


using namespace std;

const int MAXSTRLEN = 255;

class Socket {
protected:
	WSADATA wsaData; //Структура для хранения информации
	SOCKET _socket;
	SOCKET acceptSocket;
	sockaddr_in addr;

public:
	Socket();
	~Socket();

	bool SendData(char*);//Метод отправки данных в сеть
	bool RecievedData(char*, int);
	void CloseConnect();
	void SendDataMessage();
};

class ClientSocket : public Socket {
public:
	void ConnectToServer(const char* ip, int port);
};

class ServerSocket : public Socket {
public:
	void Listen();
	void Bind(int port);
	void StartHosting(int port);
};
"

Scoket.cpp
"#include <iostream>
#include "Socket.h"
#include <locale>

using namespace std;

int main()
{
	setlocale(LC_ALL, "");

	int nChoice;
	int port = 24242;
	string ipAddress;
	char recieveMessage[MAXSTRLEN];
	char sendMessage[MAXSTRLEN];
	cout << "1 - Старт сервера" << endl;
	cout << "2 - Соvединиться с сервером" << endl;
	cout << "3 - Выход" << endl;

	cin >> nChoice;
	if (nChoice == 1) {
		ServerSocket server;
		cout << "Старт сервера...." << endl;
		server.StartHosting(port);

		while (true) {
			cout << "Ждём..." << endl;
			server.RecievedData(recieveMessage, MAXSTRLEN);
			cout << "Получено:  " << recieveMessage << endl;
			server.SendDataMessage();
		}
	}
	else if (nChoice == 2) {
		cout << "Введите IP-адрес сервера:  " << endl;
		cin >> ipAddress;
		ClientSocket client;
		client.ConnectToServer(ipAddress.c_str(), port);
		while (true) {
			client.SendDataMessage();
			cout << "Ждём..." << endl;
			client.RecievedData(recieveMessage, MAXSTRLEN);
			cout << "Получено: " << recieveMessage << endl;
		}

		client.CloseConnect();
	}

	else if (nChoice == 3) {
		return 0;
	}


}
"

Source.cpp
"#include "Socket.h"
#include <locale>

using namespace std;


Socket::Socket() {
	if (WSAStartup(MAKEWORD(2, 2), &wsaData) != NO_ERROR) {
		cout << "Ошибка метода WSAStartup. " << endl;
		system("пауза...");
		WSACleanup();
		exit(10);

	}
	_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
	if (_socket == INVALID_SOCKET) {
		cout << "Ошибка создания сокета. " << endl;
		system("пауза...");
		WSACleanup();
		exit(11);

	}
}
Socket::~Socket() {
	WSACleanup();
}
bool Socket::SendData(char* buffer) {
	send(_socket, buffer, strlen(buffer), 0);
	return true;
}
bool Socket::RecievedData(char* buffer, int size) {
	int i = recv(_socket, buffer, size, 0);
	buffer[i] = '\0';
	return true;
}

void Socket::CloseConnect() {
	closesocket(_socket);
}
void Socket::SendDataMessage() {
	char message[MAXSTRLEN];
	cin.ignore();
	cout << "Введите сообщение:  ";
	cin.get(message, MAXSTRLEN);
	SendData(message);
}
void ServerSocket::StartHosting(int port) {
	Bind(port);
	Listen();
}

void  ServerSocket::Listen() {
	cout << "Ожидаем клиента..." << endl;
	if (listen(_socket, 1) ==SOCKET_ERROR){
		cout << "Ошибка инициализации сокета. " << endl;
		system("пауза...");
		WSACleanup();
		exit(15);
	}
	acceptSocket = accept(_socket, NULL, NULL);
	while (acceptSocket == SOCKET_ERROR) {
		acceptSocket = accept(_socket, NULL, NULL);
	}
	_socket = acceptSocket;
}

void ServerSocket::Bind(int port) {
	addr.sin_family = AF_INET;
	inet_pton(AF_INET, "0.0.0.0", &addr.sin_addr);

	addr.sin_port = htons(port);

	cout << "Привязка к порту   " << port << endl;
	if (bind(_socket, (SOCKADDR*)&addr, sizeof(addr)) == SOCKET_ERROR){
		cout << "Ошибка привяки к порту.. " << endl;
		system("пауза...");
		WSACleanup();
		exit(14);
		}
}


void ClientSocket::ConnectToServer(const char* ipAdress, int port) {

	addr.sin_family = AF_INET;
	inet_pton(AF_INET, ipAdress, &addr.sin_addr);
	addr.sin_port = htons(port);
		if (connect(_socket, (SOCKADDR*)&addr, sizeof(addr)) == SOCKET_ERROR){
		cout << "Ошибка подключения к серверу. \n ";
		system("пауза...");
		WSACleanup();
		exit(13);

		}
}
"