2016-08-30 85 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 []'中,這樣可以解決輸出問題和內存管理問題。 –