Winsock dateien empfangen
-
Hallo ich bin neu hier^^
ich programmier mir gerade nen Chat über Winsock, da tratt die Frage auf, wie ich die Daten richtig empfangen könnte. mit dem Befehl recv. Aber wie mache ich, dass immer wen ein datenpacket eintrifft eine Funktion ausgeführt wird und die datei einliest?burnner
ps: Hoffentlich ist hier das nun das richtige Forum
-
hi,
die funktion recv ist üblicherweise ein blocking call, dass heisst, sie blockiert den thread so lange, bis daten zum abruf bereit stehen. (du kannst die sockets auch auf non-blocking umstellen, da rate ich aber von ab.
Nun brauchst du deine recv also nur in eine while- schleife packen, die immer dann die daten in deinen buffer schreibt, wenn welche zum abholen bereit stehen. Damit deine primärer thread nicht blockiert( üblicherweise deine Grafikoberfläche) solltest du recv allerdings in einen sekundären thread packen)
Wie? -> Suche nach thread
-
Hallo,
das mit dem Thread wird nicht gehen, da ich eine DLL entwickle, wie stelle ich diese Befehle ein, damit sie nicht mehr blocken?burnner
-
warum soll das dann nicht gehen?
Der Befehl lautet:
u_long argp = 1L; // enables nonblocking ioctlsocket(s, FIONBIO, (u_long FAR*) &argp);
-
Threads funktionieren auch in einer DLL? Entschuldige mich, ich hab mich lange mit Visual Basic beschäftigt und da gibts in DLL's keine Threads
-
threads sind nicht sprachenabhängig, sonders systemabhängig, hier windows, die sprache ist nur die schnittstelle zur Windows API. Dass ne dll nen thread erstellen kann, bezweifle ich auch noch... ich meinte, ob du das nicht so regeln kannst, dass du dem anwender mit deiner dll alles bereitstellst und er dann selbst dafür sorge tragen muss, in seinem programm nen thread anzulegen.
-
Naja die DLL ist für eine Scriptsprache, da gibts keine threads.
burnner
-
Das ist doch egal wofür die dll ist.
Auch in einer DLL müsstest du Threads verwenden können. Ich habs aber selber noch nie probiert.Ansonsten kenn ich aber keinen Grund von nichtblockierenden Sockts abzuraten.
Vielleicht kann mal jemand ein paar Gründe dafür aufzählen...
-
Einen nichtblockierenden Socket mit Polling zu benutzen ist nicht sehr empfehlenswert, da der Prozessor unnoetig ausgelastet wird. Zum testen einfach mal ein kleinen Server schreiben welcher mit Polling arbeitet , starten und im Task-Manager die CPU-Nutzung beobachten...
-
Threads funktionieren auch in DLLs...
Mit select() oder WSAAsyncSelect() kann man rausfinden ob Daten zum abholen via recv() bereit stehen. Wenn man keine Threads verwenden will hält man damit also die Zeit in der der GUI-Thread blockiert ist bei kleineren Datenmengen auf fast 0
-
hi schau mal da, wirds ganz gut erklärt:
http://zfx.info/Tutorials.php?ID=84viel spaß!!
cu