Пишу сервер на С++, отправляю ему данные вида 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);
}
Что я делаю не так или так и должно быть?
Т.к. код, записывающий в буфер не приведен, то могу предположить только следующее: пишете в сокет без конечного нуля, а распечатываете через "cout<<", который ожидает этот ноль. Его можно добавить на стороне, ну тогда нужно считать объем принятых данных. Эти лишние байты - в памяти на принимающей стороне.
P.S. Принимающий буфер слишком мал для memset
char buffer[32];
int counter=0;
Вот эта строка - неопределенное поведение, она имеет право обнулить counter, а может вообще ничего не сделать:
memset(&buffer,0,sizeof(char)*33);
Для массива, но не указателя, можно записать так
memset(&buffer,0,sizeof(buffer));
Переписал на вектор символов и добавление его к строке, все работает как надо, всем спасибо.
cout<<buffer
ожидает что в буфере строка заканчивающаяся нулём.
Напишите cout.write(buf, rc);
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Конечно, согласно стандарту - cмраздел 6
Как это сделать? Запросы отправлячются через TcpClientПоэтому тело ответа походу декодировать самому нужно