2016-08-30 50 views
0

因此,我正在编写Windows聊天,并且出于测试目的,我的客户端程序每300毫秒向服务器发送一个“hello”消息。C++ Winsock2 recv junk

第一对夫妇的消息都不错,但再像他们没有理由开始变得junk- screenshot

很显然,我想解决这个问题,我寻求你们的帮助:)这里是我的代码:

发送功能:

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); 
} 

我真的很感激你的帮助以及解释为什么会发生这种情况!

+2

TL; DR;你有没有关心适当的终止你的recv缓冲区? –

+1

'(result> 0)? true:false'等于'result> 0'。 – molbdnilo

+0

哦..不知道经过2年的编程 – daavid245

回答

3

您的缓冲区未终止。因此,当您尝试使用std::cout进行打印时,会发生缓冲区溢出。接收代码正确的版本应该是:

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

而且你永远不自由分配的内存缓冲区,所以你的代码泄漏是每个Receive通话。

+0

谢谢,它工作:)我还加了'memset(rcvData,0,sizeof(char)*(length + 1));''new char []'line – daavid245

+0

'memset()'过量杀毒,根本不需要它。如果使用'std :: setw()'告诉'std :: cout'输出的最大字符数,则不需要终止缓冲区:'std :: cout << std :: setw (message.size)<< message.msg;'但是,我建议将数据存储在'std :: string'而不是'char []'中,这样可以解决输出问题和内存管理问题。 –