Socketprogrammierung client
-
hi, ich beschäftige mich z.Z. mit socketprogrammierung. ich bin dabei einen simplen ftp clienten zu programmieren. das connecten zu einem server klappt ohne probleme. wenn ich aber z.B. help eingebe, erhalte ich mehr als 1 zeile text vom server, aber ich habe das so programmiert, dass ich nur eine zeile empfange und ausgebe und wieder befehle eintippen kann. wie programmiere ich meinen clienten so, dass er eine unbestimmte anzahl an zeilen solange empfängt bis alle vom server gesendeten text zeilen empfangen wurden?
bisher habe ich das so gemacht:
if((bytes=recv(s, buf2, sizeof(buf2), 0))>0) { buf2[bytes] = '\0'; printf("%s",buf2); sendit(s); }
-
Ich mache das so:
void receive(void) { char buffer[1024], c; unsigned int pos = 0; int res; while(1) { if((res = recv(_socket, &c, 1, 0)) <= 0) { if(!res) { printf("receive error\n"); } return; } if(c == '\n' || c == '\0') break; if(c == '\r') continue; buffer[pos++] = c; } buffer[pos] = '\0'; printf("%s\n", buffer); }
Also immer 1 Zeichen einlesen, beenden, wenns ein \n ist und dann die Zeile ausgeben. Wenn es kein \0 oder \n ist, dann das Zeichen auf nen Buffer packen.
€dit: Du musst das dann bei dir etwas umcoden, dass es dann vielleicht so aussieht:
if(c == '\n') { buffer[pos] = '\0'; printf("%s\n", buffer); } if(c == '\0') break;
sonst bricht der ja immer nach einem Satz ab.
-
feigling, ich habe deinen code mal ausprobiert, aber leider funktioniert das auch nicht. der help befehlt zum beispiel enthält '\0' schon nach der 1. zeile und die restlichen zeilen werden nicht angezeigt.
der code:
feigling schrieb:
if(c == '\n' || c == '\0') break; if(c == '\r') continue; buffer[pos++] = c; } buffer[pos] = '\0'; printf("%s\n", buffer); }
funktioniert also nicht, wie ich es wünsche.
feigling schrieb:
if(c == '\n') { buffer[pos] = '\0'; printf("%s\n", buffer); }
bei diesem code besteht das problem, das auch bei einem text, der nur 1 zeile lang ist ein '\n' enthalten ist und ich daher nicht mit diesem code sagen kann,
das wenn '\n' enthalten ist auf jeden fall eine weitere zeile folgen wird.
ich muss wahrscheinlich mit select() arbeitentrotzdem vielen dank für deine hilfe