Пытаюсь сделать чат по типу клиет - сервер - клиент используя сокеты проблема в том, что когда один из клиентов закрывается, в других начинает спамиться пустые сообщения, помогите прошу // server #pragma comment(lib, "Ws2_32.lib") #include <winsock2.h> #include <iostream> #include <string> #pragma warning(disable: 4996) #define _WINSOCK_DEPRECATED_NO_WARNINGS using namespace std; SOCKET users[100]; int counter = 0; void clientHandler(int index) { char msg[256]; int msg_size; while (true) { recv(users[index], (char*)&msg_size, sizeof(int), NULL); char* msg = new char[msg_size + 1]; msg[msg_size] = '\0'; recv(users[index], msg, msg_size, NULL); for (int i = 0; i < counter; i++) { if (i == index) { continue; } send(users[i], (char*)&msg_size, sizeof(int), NULL); send(users[i], msg, msg_size, NULL); } delete[] msg; } } int main() { WSAData wsaData; WORD DLLVersion = MAKEWORD(2, 1); if (WSAStartup(DLLVersion, &wsaData) != 0) { cout << "ERROR\n"; exit(1); } SOCKADDR_IN addr; int sizeofaddr = sizeof(addr); addr.sin_addr.s_addr = inet_addr("26.234.93.121"); addr.sin_port = htons(1332); addr.sin_family = AF_INET; SOCKET sListen = socket(AF_INET, SOCK_STREAM, NULL); bind(sListen, (SOCKADDR*)&addr, sizeof(addr)); listen(sListen, SOMAXCONN); SOCKET newConnection; cout << "\n Server started\n"; for (int i = 0; i < 100; i++) { newConnection = accept(sListen, (SOCKADDR*)&addr, &sizeofaddr); if (newConnection == 0) { cout << "ERROR2\n"; } else { cout << "Client connected!\n"; users[i] = newConnection; counter++; CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)clientHandler, (LPVOID)(i), NULL, NULL); } } system("pause"); return 0; } C #pragma comment(lib, "Ws2_32.lib") #include <winsock2.h> #include <iostream> #include <string> #pragma warning(disable: 4996) #define _WINSOCK_DEPRECATED_NO_WARNINGS using namespace std; SOCKET users[100]; int counter = 0; void clientHandler(int index) { char msg[256]; int msg_size; while (true) { recv(users[index], (char*)&msg_size, sizeof(int), NULL); char* msg = new char[msg_size + 1]; msg[msg_size] = '\0'; recv(users[index], msg, msg_size, NULL); for (int i = 0; i < counter; i++) { if (i == index) { continue; } send(users[i], (char*)&msg_size, sizeof(int), NULL); send(users[i], msg, msg_size, NULL); } delete[] msg; } } int main() { WSAData wsaData; WORD DLLVersion = MAKEWORD(2, 1); if (WSAStartup(DLLVersion, &wsaData) != 0) { cout << "ERROR\n"; exit(1); } SOCKADDR_IN addr; int sizeofaddr = sizeof(addr); addr.sin_addr.s_addr = inet_addr("26.234.93.121"); addr.sin_port = htons(1332); addr.sin_family = AF_INET; SOCKET sListen = socket(AF_INET, SOCK_STREAM, NULL); bind(sListen, (SOCKADDR*)&addr, sizeof(addr)); listen(sListen, SOMAXCONN); SOCKET newConnection; cout << "\n Server started\n"; for (int i = 0; i < 100; i++) { newConnection = accept(sListen, (SOCKADDR*)&addr, &sizeofaddr); if (newConnection == 0) { cout << "ERROR2\n"; } else { cout << "Client connected!\n"; users[i] = newConnection; counter++; CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)clientHandler, (LPVOID)(i), NULL, NULL); } } system("pause"); return 0; } // client #pragma comment(lib, "ws2_32.lib") #include <winsock2.h> #include <iostream> #include <string> #define _WINSOCK_DEPRECATED_NO_WARNINGS #pragma warning(disable: 4996) using namespace std; SOCKET Connection; void ClientHandler() { int msg_size; while (true) { recv(Connection,(char*)&msg_size, sizeof(int), NULL); char* msg = new char[msg_size + 1]; msg[msg_size] = '\0'; recv(Connection, msg, msg_size, NULL); std::cout << msg << std::endl; delete[] msg; } } int main(int argc, char* argv[]) { //WSAStartup WSAData wsaData; WORD DLLVersion = MAKEWORD(2, 1); if (WSAStartup(DLLVersion, &wsaData) != 0) { std::cout << "Error" << std::endl; exit(1); } SOCKADDR_IN addr; int sizeofaddr = sizeof(addr); addr.sin_addr.s_addr = inet_addr("26.234.93.121"); addr.sin_port = htons(1332); addr.sin_family = AF_INET; Connection = socket(AF_INET, SOCK_STREAM, NULL); if (connect(Connection, (SOCKADDR*)&addr, sizeof(addr)) != 0) { std::cout << "Error: failed connect to server.\n"; return 1; } std::cout << "Connected!\n"; CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)ClientHandler, NULL, NULL, NULL); string msg1; while (true) { getline(cin, msg1); int msg_size = msg1.size(); send(Connection, (char*)&msg_size, sizeof(int), NULL); send(Connection, msg1.c_str(), msg_size, NULL); Sleep(10); } system("pause"); return 0; } C #pragma comment(lib, "ws2_32.lib") #include <winsock2.h> #include <iostream> #include <string> #define _WINSOCK_DEPRECATED_NO_WARNINGS #pragma warning(disable: 4996) using namespace std; SOCKET Connection; void ClientHandler() { int msg_size; while (true) { recv(Connection,(char*)&msg_size, sizeof(int), NULL); char* msg = new char[msg_size + 1]; msg[msg_size] = '\0'; recv(Connection, msg, msg_size, NULL); std::cout << msg << std::endl; delete[] msg; } } int main(int argc, char* argv[]) { //WSAStartup WSAData wsaData; WORD DLLVersion = MAKEWORD(2, 1); if (WSAStartup(DLLVersion, &wsaData) != 0) { std::cout << "Error" << std::endl; exit(1); } SOCKADDR_IN addr; int sizeofaddr = sizeof(addr); addr.sin_addr.s_addr = inet_addr("26.234.93.121"); addr.sin_port = htons(1332); addr.sin_family = AF_INET; Connection = socket(AF_INET, SOCK_STREAM, NULL); if (connect(Connection, (SOCKADDR*)&addr, sizeof(addr)) != 0) { std::cout << "Error: failed connect to server.\n"; return 1; } std::cout << "Connected!\n"; CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)ClientHandler, NULL, NULL, NULL); string msg1; while (true) { getline(cin, msg1); int msg_size = msg1.size(); send(Connection, (char*)&msg_size, sizeof(int), NULL); send(Connection, msg1.c_str(), msg_size, NULL); Sleep(10); } system("pause"); return 0; }