Объясните новичку.
Требуется передавать множество строк вида "data1 \t data2 \t ... dataN \n"
Передачу осуществляю стандартно через send(sock, tstr, strlen(tstr), 0);
При этом посылается подряд несколько строк (циклом)
Прием осуществляю так: i=recv(sock, buf, BUFSZ, 0);
Что я буду получать с каждым recv ?? одну строку? или все строки друг за другом, пока не заполнится buf ??Как разделить полученный поток построчно?
Получите как получится :) Может все сразу, а может и побайтно.
>Получите как получится :) Может все сразу, а может и побайтно.А как это "что получится" построчно-то разобрать ?
никогда не работал с подобным "нипонять что" и даже не представляю, как такое сделать...
Попробовал и сделал так. Если есть замечания и все такое...#define BUFSZ 1024;
//....
char buf[1];
char dbuf[BUFSZ];
//....while(1)
{
// Принимаем соединение
if((c = accept(s, cp, &sz)) == -1)
{
perror("Ошибка при выполнении accept");
exit(1);
}
// Принимаем данные
bzero((char *)&dbuf[0],BUFSZ);
while((recv(c, (char *)&buf[0], 1, 0)) > 0)
{
if (buf[0]!='\n')
strncat((char *)&dbuf[0],(char *)&buf[0],1);
else
{
if (strncmp((char *)&dbuf[0],"ENDOFDATA",9)==0)
break;
//Обработаем полученную строчку
//....
bzero((char *)&dbuf[0],BUFSZ);
}
}
// Закрываем соединение
close(c);
}//....
Если объяснять в 2-х словах, то в простейшем случае для пересылки чего-либо формируешь блок из двух полей - размер данных
Если объяснять в 2-х словах, то в простейшем случае для пересылки чего-либо формируешь блок из двух полей - размер данных и данные
uint|data...При приеме ожидаешь первые 4 байта - размер приходящих данных, далее ожидаешь пока придут все данные полученного размера.
Ну, а дальше все зависит от вашей фантазии...
Не обижайтесь, но вам нужно серьёзно поработать над языком (в смысле, над C). То, что вы привели, просто трудно читать.
char buf[1]; - это зачем? почему не char b;?
(char *)&dbuf[0] - это вообще нонсенс. нужно написать просто dbuf.
И ';' после определения макроса не ставится...
То есть это всё конечно корректно с точки зрения языка, но никак не с точки зрения здравого смысла.
Так же, делать bzero в конце каждой итерации цикла... в этом нет никакого смысла.Что касается вашего случая, то можно попробовать что-нибудь вроде:
#define BUFSZ 1024
//....
char dbuf[BUFSZ];
FILE* f;
//....while(1)
{
// Принимаем соединение
if((c = accept(s, cp, &sz)) == -1)
{
perror("Ошибка при выполнении accept");
exit(1);
}
f = fdopen(c, "w+");
if(!f)
{ perror(...);
exit(1);
}
// Принимаем данные
while(fgets(dbuf, BUFSZ, f))
{
if (strncmp(dbuf,"ENDOFDATA",9)==0)
break;
//Обработаем полученную строчку
//....
}
// Закрываем соединение
shutdown(...);
fclose(f);
}//....
Вроде это должно работать. Если же необходимо использовать recv(2) с какими-то параметрами НЕ по-умолчанию, то можно написать свой аналог fgets(3).