多线程C ++ Winsock套接字中消息重复和丢失的原因?

问题描述

void TCPConnectionV5::startServer()
{
    /* Initialize Winsock */
    int start;
    sockaddr_in SERVER;
    SERVER.sin_family = AF_INET;
    SERVER.sin_addr.s_addr = INADDR_ANY;
    //SERVER.sin_port = htons(stoi(DEFAULT_PORT));
    SERVER.sin_port = htons(1787);
    start = WSAStartup(MAKEWORD(2,2),&_wsaData);
    if (start != 0)
    {
        cout << "Error on WSAStartup: " << start << endl;
    }
    /* Create socket that will connect to server */
    _listener = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
    _socketCollection.push_back(_listener);

    if (_listener == INVALID_SOCKET)
    {
        cout << "Error creating socket to connect to server: " << WSAGetLastError() << endl;
        WSACleanup();
    }

    /* Bind the socket */
    start = bind(_listener,(sockaddr*)&SERVER,sizeof(SERVER));
    if (start == SOCKET_ERROR)
    {
        cout << "Error on bind:" << WSAGetLastError() << endl;
        closesocket(_listener);
        WSACleanup();
    }
    /* Create the listener socket */
    start = listen(_listener,16);
    if (start == SOCKET_ERROR)
    {
        cout << "Error on entering the listening state: " << start << endl;
        closesocket(_listener);
        WSACleanup();
    }
    printTime();
    cout << "Server entered listening state" << endl;

    /* Create the thread */
    sockaddr_in client;
    int clientSize = sizeof(client);
    while (true)
    {
        SOCKET messager = accept(_listener,(struct sockaddr*)&client,&clientSize);
        _socketCollection.push_back(messager);
        locker.lock();
        printTime();
        if (messager != SOCKET_ERROR)
        {
            cout << "Client Connection success!" << endl;
            cout << "Messager: " << messager << endl;
            locker.unlock();
            std::thread newThread([&] {this->exchange(messager); });
            newThread.detach();
        }
        else
        {
            locker.unlock();
        }
    }
}

DWORD TCPConnectionV5::exchange(SOCKET messager)
  {
    int bytesSent = sendMessage(messager,msg);
    if (bytesSent <= 0)
    {
        closesocket(messager);
        return -1;
    }
    int bytesReceived = receiveMessage(messager);
    if (bytesReceived <= 0)
    {
        closesocket(messager);
        return -1;
    }
}

我注意到,当服务器与多个客户端连接时,有时会出现重复的消息发送给某些客户端,同时伴随着丢失到另一个客户端应用程序的消息。我已经设置了互斥锁锁定/解锁来发送/接收消息,但是是什么导致这些重复/丢失的消息呢?关于线程,我必须解决一些潜在的问题吗?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)