Не обижайтесь, но вам нужно серьёзно поработать над языком (в смысле, над 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).