Die ganze Schlaufe schien mir zu kompliziert zu sein. Ich habe dann auch eine etwas einfachere Variante gefunden, indem ich recv() durch read() ersetzt und den ürberflüssigen timeout-Test weggelassen habe:
int mehrfach_read(int fd,char *buf,int n)
{
int ret;
for(int j=0; j < BUF_SIZE-1 && (ret=read(fd,&buf[j],n)) > 0; )
{
j += ret;
if(j>2 && (strcmp(&buf[j-2],"\n\n")==0 || strcmp(&buf[j-3],"\n\r\n")==0))
{return j;}//fertig wenn Leerzeile gelesen
n=1; //beim naechsten Durchlauf 1 weiteres Byte lesen
}
return -1;//Fehler wenn keine Leerzeile gefunden
}
Aufruf der Schlaufe mache ich dann so:
//ret = mehrfach_read(sockfd, buffer, BUF_SIZE);
ret = mehrfach_read(sockfd, buffer, sizeof(http_ok)+2);
Statt BUF_SIZE habe ich gleich die minimale Antwortlänge angegeben, sonst könnte es vielleicht Probleme geben falls es irgendwann mal einen schnelleren Controller gibt.
Mit dem Vorschlag von noiasca nach einfacherem Leerzeilen-Test wird es vielleicht nochmals etwas einfacher. Werde das demnächst noch ausprobieren.