socket recv
-
hmm... das ist ja kompliziert... eine schleife klingt gut, aber in dem fall eher eine schleife mit warte-funktion oder so.
wie sieht denn eine schleife, die auf netzwerkdaten von einem bestimmten client wartet, aus?
Mondmann schrieb:
Was ist in diesem FAlle buf?
Wenn buf ein zB. char[1000] buf ist und du schreibst sizeof(buf) ist das immer 1, da char 1 byte ist...wirklich? hab ich nie bemerkt. ich verwende visual studio c++.
danke und mfg
cppmember
-
edit: unsinn gelöscht
-
Das liegt daran, dass bei
char buf[1000];sizeof(buf) wirklich 1000 liefert.
Wenn du aber aber so etwas hast:
char* buf=new char[1000];Dann würde sizeof(buf) 4 zurückgeben.
-
Nanyuki schrieb:
Das liegt daran, dass bei
char buf[1000];sizeof(buf) wirklich 1000 liefert.
Wenn du aber aber so etwas hast:
char* buf=new char[1000];Dann würde sizeof(buf) 4 zurückgeben.
c++ basics, das kenne ich.
-
Stimmt ich hab nen käse geschrieben.
Ich mach jetzt feierabend, ich checks heute eh nimmer:-)
-
Mondmann schrieb:
Stimmt ich hab nen käse geschrieben.
Ich mach jetzt feierabend, ich checks heute eh nimmer:-)des macht nix.
Zurück zum Thema:
Mein Code sieht ungefähr so aus:
while(1) { FD_ZERO(&fds); max = fill_set(&fds, &list); FD_SET(s, &fds); if (s > max) max = s; select(max + 1, &fds, NULL, NULL, NULL); if (FD_ISSET(s, &fds)) { lz = add_client(&list); c = accept(s, (sockaddr *)&(lz->addr), &addrlen); lz->sock = c; } else { sender = get_sender(&fds); bytes = recv(sender, buf, sizeof(buf), 0); //PROBLEM: hier soll sichergestellt werden dass daten von diesem "sender" komplett ankommen } }Hat jemand ne Idee?
Oder muss ich auf select-Methode verzichten und für jeden Client einen Thread starten?
-
ERrrrrrrrrrrrrrrrm... Das geht doch viel einfacher

Dem flags argument gibste einfach MSG_WAITALL. fertig. (POSIX-konform)
-
@voidpointer: Windows ist nicht POSEX-konform.
-
hinweis schrieb:
@voidpointer: Windows ist nicht POSEX-konform.
Sicher? Es gibt AFAIK POSIX-konforme Compiler für Windoof... vllt könnte man MinGW probieren...
-
ok werde mal nachschauen, auf den ersten blick fand ich keine definition von MSG_WAITALL
-
Musste auch vor kurzem feststellen, dass windoof kein MSG_WAITALL hat...
ein kleiner Wrap derart sollte es machen, getestet hab ich es noch nicht...
#ifdef __WIN32__ bool Client::recv(void * buf , size_t len , int flags) { register size_t received = 0, next; do { next=(::recv(sock, (char*)buf+received, len-received, flags)); received+=next; } while (received<len && next); // TODO ... return (bool)next; } #else // ... // POSIX IMPLEMENTATION #endif // __WIN32__Wie gesagt ich bin mir da nicht sicher und habs noch nicht getestet... evtl. muss noch nen select rein...
Aber vllt hilft's dir ja
-
Hmmm danke aber ich glaub nicht das der code mir was hilft, denn es geht ja darum darauf zu warten bis alle daten angekommen sind. kann ja sein dass der rest erst nach 1000ms ankommen.
ich muss wohl beim senden eine Länge mitgeben und dann würde dein Code auch nützlich sein, es sei denn man kriegt den parameter "len" irgendwie vom system mit.
und zum schluss muss ich das gesamte system auf threads um stellen, select ist nicht geeignet, weil der server schliesslich in der warte-zeit andere clients bedienen soll.
ich wollte nicht mit threads arbeiten, weil thread-save ziemlich kompliziert sein würde
-
cppmember schrieb:
ich wollte nicht mit threads arbeiten, weil thread-save ziemlich kompliziert sein würde
Eigentlich musst du nur aufpassen, dass die Schnittstelle der Threads relativ klein bleibt und die halt absichern
