簡體   English   中英

C ++ Winsock2接收垃圾

[英]C++ Winsock2 recv junk

因此,我正在編寫Windows聊天程序,並且出於測試目的,我的客戶端程序每300毫秒向服務器發送一條“ hello”消息。

最初的幾條消息很好,但后來卻無緣無故地開始變得垃圾- 屏幕截圖

顯然,我想修復它,並尋求您的幫助:)這是我的代碼:

發送功能:

bool Target::Send(char *message)
{
    int length = strlen(message);
    int result = send(this->ccSock, (char*)&length, sizeof(int), 0);
    if (result <= 0)
        return false;

    Sleep(10);

    result = send(this->ccSock, message, length, 0);
    return ((result > 0) ? true : false);
}

接收功能:

Message Server::Receive(SOCKET socket)
{
    int length = 0;
    int result = recv(socket, (char*)&length, sizeof(int), 0);

    Sleep(10);

    char *rcvData = new char[length];
    result = recv(socket, rcvData, length, 0);

    return { rcvData, result };
}

消息結構:

struct Message {
    char *msg;
    int size;
};

主要發送代碼:

while (true)
{
    if (!target->Send("hello"))
    {
        cout << "Connection broken\n";
        target->Clean();
        break;
    }

    Sleep(300);
}

主要接收代碼:

while (target.sock)
{
    Message message = server->Receive(target.sock);
    if (message.size > 0)
        cout << message.msg << " (" << message.size << ")\n";
    else
    {
        cout << "Target disconnected\n";
        server->Clean();
        break;
    }

    Sleep(1);
}

我非常感謝您的幫助以及解釋為什么會發生這種情況!

您的緩沖區不是以null終止的。 因此,當您嘗試使用std::cout打印它時,會發生緩沖區溢出。 接收代碼的正確版本應為:

char *rcvData = new char[length+1];
result = recv(socket, rcvData, length, 0); 
rcvData[length] = '\0';

另外,您永遠不會釋放分配的內存緩沖區,因此您的代碼會在每次Receive調用時將其泄漏。

暫無
暫無

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

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