Данные, полученные через сокеты, не могут быть использованы C ++ - PullRequest
0 голосов
/ 23 февраля 2012

, поэтому я получаю соединение через сокет, и получаю правильное сообщение ... однако, когда я пытаюсь извлечь его из буфера приема ... оно не работает. Мой код выглядит примерно так:

void CClientSocket::OnReceive(int nErrorCode) 
{
    char buff[1000];
    int ibuf = Receive(buff,sizeof(buff));
    buff[sizeof(buff)-1] ='\0';
    CSocket::OnReceive(nErrorCode);
}

Когда я запускаю в режиме отладки, значение buff содержит правильное сообщение ... вместе с кучей случайных символов, заполняющих неиспользуемую часть массива. Тем не менее, я не могу использовать эти данные ... если я пытаюсь преобразовать в CString или даже перенести символы в другой массив ... ничего не работает. Я сбит с толку, и я действительно не знаю, что делать.

Дайте мне знать, если вам нужна дополнительная информация или я не совсем уверен.

РЕДАКТИРОВАТЬ: какой-то код, который я пытался извлечь данные

CString string;
string = CString(buff);

И

char *msg;
msg = new char[ibuf]
for(int i = 0; i < ibuf; i++){
    msg[i] = (char)buff[i];
}

РЕДАКТИРОВАТЬ: некоторые уточнения когда я сказал «ничего не работает», я имел в виду, что когда я пытался конвертировать его, в результате получалась пустая строка CString или пустой символ и т. д. ... ошибок нет.

1 Ответ

4 голосов
/ 23 февраля 2012
int ibuf = Receive(buff,sizeof(buff));
buff[sizeof(buff)-1] ='\0';

Вместо этой второй строки установите нулевой байт на buff[ibuf].Но перед этим добавьте проверку ошибок (убедитесь, что ibuf > 0, а если нет, обработайте ее как разрыв соединения.) Кроме того, если вы делаете это таким образом, вы должны Receive(buff, sizeof(buff)-1); (обратите внимание на -1 - это учитываетзавершающий символ - спасибо @Altnitak за указание на это.)

С другой стороны ... Я бы также сказал, что это не способ обработки кода сокета.Строки не отправляются атомарно по сети.Они будут разделены.Если вы управляете протоколом, я предлагаю вам покинуть строковое представление юниверса и структурировать сетевые коммуникации так, чтобы сообщения начинались с целого числа (uint16_t или uint32_t), и обязательно вызывайте htons / htonl и т. Д.) С указанием длины полезной нагрузки, которая следует.Затем продолжайте буферизовать входящие байты и обрабатывать их, когда у вас будет достаточно для удовлетворения заданной длины.

Если вы не управляете протоколом, найдите удобный маркер, который можно использовать, чтобы решить, когда обрабатывать содержимое, и буферизуйте байты.пока ты не достигнешь этого.(Например, если вы используете HTTP, вы можете буферизовать символы, пока не увидите новую строку при обработке заголовков, а затем выбрать определенный размер буфера для содержимого ответа ...)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...