首页 > 解决方案 > Winsock两次发送消息c ++

问题描述

所以我的问题是,当我在 do-while 循环中使用 WinSock“发送”时,PUTTY 会收到两次。

char sendBuffer[] = "this is my message to the world";
do
{
    iResult = recv(clientSocket, recvBuffer, DEFAULTBUFFERLEN, 0);
    if(iResult > 0)
    {
        std::cout << "Received bytes: " << iResult << std::endl;

        std::cout << recvBuffer << std::endl;
        //Successful receive, now send back a message
        Message("Now it's your turn to say something!");
        //std::cin.getline(sendBuffer, DEFAULTBUFFERLEN);
        std::cin.get();
        iSendResult = send(clientSocket, sendBuffer, sizeof(sendBuffer), 0);
        if(iSendResult == SOCKET_ERROR)
        {
            Message("Error with send. ERROR: " + WSAGetLastError());
            closesocket(clientSocket);
            WSACleanup();
            return 8;
        }

        std::cout << "Bytes sent: " << iSendResult << std::endl;
    }
    else if(iResult == 0)
    {//Nothing has been received, client has disconnected
        Message("Closing connection with client");
    }else
    {// there was an errror and the connection needs to be closed
        Message("Error Receiving. Error: " + WSAGetLastError());
        closesocket(clientSocket);
        WSACleanup();
        return 9;
    }

}while(iResult > 0);

代码运行良好,编译和整体运行顺利,唯一的问题是发送调用由于某种原因发送了两次。

我在此之前调用一次发送只是为了说“欢迎来到服务器”,但实际上只发送一次。只有这一位发送两次。我正在使用 mingw 进行编译,这是我的构建脚本

g++ server.cpp -o server -lws2_32 -lwsock32

编辑:根据我的调试器,代码在收到来自客户端的初始消息时运行一次,然后再次运行并在再次运行时接收“\r\n”,因此重复消息而不等待新的客户端消息

标签: c++socketsnetwork-programmingwinsock2

解决方案


因此,经过一些调试后,我发现了问题,当您按 Enter 时,腻子会发送一条额外的消息(或类似的东西。因此,解决方案是使用具有以下条件的 if 语句包装处理接收到的消息的代码:

if((std::string)recvBuffer != "\r\n" || (std::string)recvBuffer != "\n")

推荐阅读