Ich glaub jetzt habe ich den Fehler im Client (c-Program auf dem Computer) gefunden: ich rufe recv() einfach mehrfach auf bis eine Leerzeile gelesen wird, die dann das Ende vom Header markiert.
Also dieses
ret = recv(sockfd, buffer, BUF_SIZE, 0);
ersetzt durch
ret = mehrfach_recv(sockfd, buffer, BUF_SIZE, 0);
Mit entsprechendem neuen Unterprogramm:
int mehrfach_recv(int sockfd, char *buffer, int size, int flags)
{
int ret,i,j, imax=1000000; //Schlaufenabbruch nach ca. 1 Sekunde
int n=size;
for(i=j=0; (ret = recv(sockfd, &buffer[j], n, flags)) >= 0 && i<imax; i++)
{
j += ret;
if(j>3 && strncmp(&buffer[j-3],"\n\r\n",3)==0 || strncmp(&buffer[j-2],"\n\n",2)==0)
{break;}//fertig wenn Leerzeile erkannt
if(j>=size) {printf("Buffer zu klein\n"); return -1;}
n=1; //im naechsten Durchlauf 1 weiteres Byte empfangen
usleep(1); // 1 Microsekunde warten
}
if(i>=imax) {printf("timeout in mehrfach_recv()\n"); return -1;}
if(ret<0) return ret;
return j;
}
So funktioniert es auch wenn ich im Server den Header mit mehreren println() Aufrufen sende.
Fragt sich jetzt noch ob man das wirklich so kompliziert machen muss, oder ob es nicht doch auch einfacher gehen würde.
Danke für die Anregung