c++ - 检测断开 Winsock C++

标签 c++ visual-studio-2012 winsock winsock2

我是 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 发​​出信号) ())., 或者转到异步或多路复用 I/O,这是两个完整的鱼缸。

关于c++ - 检测断开 Winsock C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19263984/

相关文章:

c++ - IcmpSendEcho 返回 183

c++ - memcpy 中的数据损坏

c++ - 选择功能不断返回-1

c++ - 嵌套类是类模板中的依赖类型?

c++ - 编辑距离递归算法——Skiena

c++ - While 循环导致 SDL_Rect 和 SDL_Textures 滞后?

c++ - 将对象添加到 vector 结果为 "does not have class type exception"

visual-studio - Visual Studio 2012 中的外部链接不适用于 Windows 8

c++ - for 循环中的奇怪行为 - 一个错误?

升级到 Visual Studio 2012 时 C# 动态类型中断