簡體   English   中英

檢測斷開連接Winsock C ++

[英]Detect disconnect Winsock C++

我是C ++的新手。 我了解面向對象的編程。

我遵循了一個教程,並將此客戶端/服務器代碼組合在一起。 我現在想在客戶端斷開連接時向服務器添加一條消息。

我正在使用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();
}

您無法用當前代碼檢測到它,因為您當前的服務器所做的只是將一條消息發送到新接受的連接(該連接不太可能失敗),然后完全忘記該連接。包括將其套接字泄漏到超空間中。

您需要為每個連接啟動一個新線程,它將處理該連接上的所有I / O,包括斷開連接(由recv()返回零表示)或錯誤(由send()或recv()返回-1表示錯誤)。 。,否則轉到Async或Multiplex I / O,這是兩條完整的魚缸。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM