Чтение сокета средствами C++

116
11 июля 2021, 07:10

Пишу сервер на С++, отправляю ему данные вида dhw6558d5fjf48dnbp5fps5tkze5f83n{\"gl\":\"123\"} а получаю это и еще 5 непонятных символов.

Oof: dhw6558d5fjf48dnbp5fps5tkze5f83n
Content: {"gl":"123"}
����� или �jX�� бывает

Выполняется эта функция:

    static void *read(void *args){
        cout<<"Oof..."<<endl;
        int s=*((int*)args); //сокет
        char buffer[32];
        int counter=0;
        int i=0;
        while(true){
            int rc;
            memset(&buffer,0,sizeof(char)*33);
            rc=recv(s,buffer,32,0);
            if(rc<=0)
                break;
            if(i==0){
                cout<<"Oof: "<<buffer<<endl<<"Content: ";
            }else{
                cout<<buffer<<endl;
            }
            i++;
        }
        pthread_exit(NULL);
    }

Что я делаю не так или так и должно быть?

Answer 1

Т.к. код, записывающий в буфер не приведен, то могу предположить только следующее: пишете в сокет без конечного нуля, а распечатываете через "cout<<", который ожидает этот ноль. Его можно добавить на стороне, ну тогда нужно считать объем принятых данных. Эти лишние байты - в памяти на принимающей стороне.

P.S. Принимающий буфер слишком мал для memset

char buffer[32];
int counter=0;

Вот эта строка - неопределенное поведение, она имеет право обнулить counter, а может вообще ничего не сделать:

memset(&buffer,0,sizeof(char)*33); 

Для массива, но не указателя, можно записать так

memset(&buffer,0,sizeof(buffer)); 
Answer 2

Переписал на вектор символов и добавление его к строке, все работает как надо, всем спасибо.

Answer 3

cout<<buffer ожидает что в буфере строка заканчивающаяся нулём.

Напишите cout.write(buf, rc);

READ ALSO
Возвращаемый тип main должен быть int, а не void [дубликат]

Возвращаемый тип main должен быть int, а не void [дубликат]

Конечно, согласно стандарту - cмраздел 6

145
Почему json приходит не весь?

Почему json приходит не весь?

Отправляю в ответ на запрос json

106
&ldquo;Вручную&rdquo; расшифровать ответ от сайта формата &ldquo;Content-Encoding: br&rdquo;

“Вручную” расшифровать ответ от сайта формата “Content-Encoding: br”

Как это сделать? Запросы отправлячются через TcpClientПоэтому тело ответа походу декодировать самому нужно

99