Обнаружить отключение Winsock C ++

0

Я новичок в c++. Я понимаю объектно-ориентированное программирование.

Я последовал за учебником и составил этот код Client/Server. Теперь я хотел бы добавить сообщение на сервер, когда клиент отключен.

im с использованием vs11

Сервер:

#include "main.h"

using namespace std;

void main ( )
{
    long answer;
    WSAData wsaData;
    WORD DLLVERSION;
    DLLVERSION = MAKEWORD(2,1);

    answer = WSAStartup(DLLVERSION, &wsaData);

    //WINSOCK LOADED

    SOCKADDR_IN addr;
    int addrlen = sizeof(addr);

    SOCKET sListen;
    SOCKET sConnect;
    SOCKET* Connections;
    static int ConCounter = 0;

    Connections = (SOCKET*)calloc(64, sizeof(SOCKET));

    sConnect = socket(AF_INET,SOCK_STREAM,NULL);

    addr.sin_addr.s_addr = inet_addr("127.0.0.1");

    addr.sin_family = AF_INET;

    addr.sin_port = htons(1234);


    sListen = socket(AF_INET,SOCK_STREAM,NULL);

    bind(sListen, (SOCKADDR*)&addr, sizeof(addr));

    listen(sListen, SOMAXCONN);

    for(;;)
    {
        cout << "Wating for connection..." <<endl;

        if(sConnect = accept(sListen, (SOCKADDR*)&addr, &addrlen))
        {
            Connections[ConCounter] = sConnect;

            cout << "Connection found " << ConCounter <<endl;

            answer = send(Connections[ConCounter], "YourMessage", 12, NULL);

            ConCounter++;
        }
    }
}    

Клиент:

#include "main.h"

using namespace std;

void main ( )
{
    string confirm;
    char message[200];
    string strmessage;

    long answer;
    WSAData wsaData;
    WORD DLLVersion;
    DLLVersion = MAKEWORD(2,1);
    answer = WSAStartup(DLLVersion, &wsaData);

    SOCKADDR_IN addr;

    int addrlen = sizeof(addr);

    SOCKET sConnect;

    sConnect = socket(AF_INET, SOCK_STREAM,NULL);



    addr.sin_addr.s_addr = inet_addr("127.0.0.1");

    addr.sin_family = AF_INET;


    addr.sin_port = htons(1234);

    cout << "Do you want to connect to the Server? [Y/N]" <<endl;
    cin >> confirm;

    if(confirm == "N")
    {
        exit(1);
    }
    else
    {
        if(confirm == "Y")
        {
            connect(sConnect, (SOCKADDR*)&addr, sizeof(addr));

            answer = recv(sConnect, message, sizeof(message), NULL);

            strmessage = message;
            cout << strmessage <<endl;

            getchar();
        }
    }
    getchar();
}
Теги:
winsock
visual-studio-2012
winsock2

1 ответ

3
Лучший ответ

Вы не можете обнаружить его с помощью вашего нынешнего кода, потому что весь ваш настоящий сервер выполняет одно сообщение для недавно принятого соединения, которое вряд ли потерпит неудачу, а затем полностью забудьте об этом соединении, включая утечку его сокета в гиперпространство,

Вам нужно либо запустить новый поток для каждого соединения, что будет иметь дело со всеми вводами/выводами на этом соединении, включая разъединения (с сообщением recv(), возвращающим нуль) или ошибки (с сообщением -1 возвращается с send() или recv())., либо перейдите в Async или мультиплексированный ввод-вывод, который представляет собой два целых чайных чайника рыбы.

  • 0
    так что мне нужно создать сокет, определенный переменной в функции? Я знаю, это звучит глупо, но что вы посоветуете мне узнать прямо сейчас, исходя из моей ситуации? Я хочу сделать программу на C ++ с сетью. Я знаю Java / PHP / Vb довольно хорошо, и я понятия не имею, что я делаю с сокетами / потоками.
  • 0
    Я не знаю, откуда у тебя первое предложение. Это не имеет никакого отношения ко всему, что я сказал. Я рекомендую вам прочитать базовое руководство по сетевым программам и решить, для чего на самом деле предназначена ваша программа . это не делает ничего полезного в данный момент.
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню