首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++ Winsock2 recv垃圾

C++ Winsock2 recv垃圾
EN

Stack Overflow用户
提问于 2016-08-30 11:28:15
回答 1查看 537关注 0票数 0

因此,我正在编写Windows聊天,为了测试目的,我的客户端程序每300 ms向服务器发送一条"hello“消息。

最初的几条信息很好,但却无缘无故地变成了垃圾-

显然,我想修复它,并寻求您的帮助:)下面是我的代码:

发送函数:

代码语言:javascript
复制
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);
}

接收功能:

代码语言:javascript
复制
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 };
}

消息结构:

代码语言:javascript
复制
struct Message {
    char *msg;
    int size;
};

主发送代码:

代码语言:javascript
复制
while (true)
{
    if (!target->Send("hello"))
    {
        cout << "Connection broken\n";
        target->Clean();
        break;
    }

    Sleep(300);
}

主接收代码:

代码语言:javascript
复制
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);
}

我非常感谢你的帮助,并解释为什么会发生这种情况!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-08-30 11:37:13

缓冲区不为空终止。因此,当您试图使用std::cout打印它时,缓冲区溢出就会发生。接收代码的正确版本应该是:

代码语言:javascript
复制
char *rcvData = new char[length+1];
result = recv(socket, rcvData, length, 0); 
rcvData[length] = '\0';

此外,您从未释放分配的内存缓冲区,因此您的代码会在每个Receive调用中泄漏它。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39226297

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档