Указатель C с буфером recv, отображающим «Неполную последовательность» - PullRequest
0 голосов
/ 29 января 2019

Я читаю некоторые данные в буфер в цикле recv while.

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

Однако, когда я смотрю на позицию указателя (и содержимое, которое выходитиз вызова strcpy) мой отладчик показывает только первые несколько байтов, за которыми следует сообщение «Неполная последовательность», а буферная копия включает в себя только несколько байтов, вплоть до того, что в буфере выглядит как байт, читающий \000.

Этот пост описывает проблему, возникающую из-за того, что полученные символы не заканчиваются NUL.Я сделал это, и, похоже, все еще происходит.Сам буфер выглядит нормально, но он всегда выглядит так, как будто указатель никогда не находится в правильном положении.

Я новичок в C. Как правильно получить оставшиеся предметы, чтобы я мог выполнить работу, необходимую для копирования оставшегося содержимого?

// reading in 256 bytes and leaving last one open to add null term
// at the start of the loop
// buffer contains: 
//`"[stuff to look past]377\330\377\340\000\020JFIF\000\001\..."`

while ((receivedBytes = recv(sock, buffer, BUFSIZE - 1, MSG_CONFIRM)) > 0) {
               buffer[BUFSIZE] = '\0';
// stuff to do ...
// len is calculated as the length of the start of the buffer to look past
// so move the pointer to the start of the contents I want to copy
// but p = [stuff to look past]377\330\377 <incomplete sequence \340>
// and no content past is read into the pointer
                        char * p = buffer;
                        p += len
// memcpy fails
                        memcpy(content, p, sizeof(content));

Спасибо за любую информацию.

1 Ответ

0 голосов
/ 29 января 2019

Переместите объявление

char * p = `buffer`;

Вне цикла (и другие предложения):

char * p = NULL;
char content[BUFSIZE];  //this needs to be defined somewhere in your code
                        //as an array if the sizeof macro is to work.
//char *content = calloc(BUFSIZE, 1);//or as a pointer with memory created.
                                     //then freed when no longer needed.


while ((receivedBytes = recv(sock, buffer, BUFSIZE - 1, MSG_CONFIRM)) > 0) {
               buffer[receivedBytes] = '\0';

                        p += receivedBytes;//use receivedBytes to set position.
                        memcpy(content, p, receivedBytes);//use receivedBytes, not sizeof(content). 
                       ...
}

Существует множество ссылок на использование для recv(), в том числе:

функция recv |Документы Microsoft

recv () - Системный вызов Unix Linux

Вы также упомянули Содержимое вперед буфером, который мне нужен, чтобы просмотреть прошлое и добраться до оставшихся байтов ... .Рассматривали ли вы использование strstr () или strchr .Оба возвращают указатели либо на искомую подстроку, либо на искомый символ.

Например, если у вас есть известный уникальный символ, который используется в качестве разделителя в вашей строке данных, скажем '>', тогда strchr () можно использовать для размещения указателя насодержимое после местоположения этого char:

char *p = NULL;
const char source[] = {"this is >test string"};
char buff[20];

p = strchr(source, '>');
if(p)
{

    //     "this is >test string"
    //  p is here   ^
    p++; 
    //     "this is >test string"
    //  p is here    ^  
    strcpy(buff, p); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...