Загрузка...

Помогите с кодом

Тема в разделе C/C++ создана пользователем zhelukq 4 дек 2022. 154 просмотра

  1. zhelukq
    zhelukq Автор темы 4 дек 2022 6 17 мар 2019
    Пытаюсь сделать чат по типу клиет - сервер - клиент используя сокеты
    проблема в том, что когда один из клиентов закрывается, в других начинает спамиться пустые сообщения, помогите прошу :da:


    // server
    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

    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;
    }
     
    4 дек 2022 Изменено
Top
Загрузка...