2016-08-30 5 views
0

Итак, я пишу чат Windows и для тестирования моя клиентская программа отправляет на сервер «привет» сообщение каждые 300 мс.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

'(результат> 0)? true: false' эквивалентно 'result> 0'. – molbdnilo

+0

oh .. не знал, что после 2 лет программирования – daavid245

ответ

3

Ваш буфер не имеет значения null. Поэтому, когда вы пытаетесь распечатать его с использованием переполнения буфера 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() 'overkill, вам это совсем не нужно. И вам не нужно обнулять нуль, если вы используете 'std :: setw()', чтобы сообщить 'std :: cout' максимальное количество выводимых символов:' std :: cout << std :: setw (message.size) << message.msg; 'Однако я бы предложил хранить данные в' std :: string' вместо 'char []', которые будут заботиться о проблеме вывода и проблеме управления памятью , –