Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
RebornX JLI'ler
Anmeldedatum: 16.03.2007 Beiträge: 169
Medaillen: Keine
|
Verfasst am: 12.11.2007, 13:50 Titel: WinSocks beim start starten... |
|
|
Hi,
ehm ich bastel grade an sonem "Multi-Chat" in WinApi mit WinSocks und stoße schon auf erste Hürden^^ rofl...
http://www.imagespell.com/show.php?id=2e4fe38a1f55eef12ce6423db95c17fc.jpg
Doch wie mache ich es, dass die WinSocks beim start (nachdem das Fenster erstellt würde) ausgeführt werden?? Also von WSAStartup bis accept() ??
In dem Screen^^ habe ich es von WSAStartup bis zum listenModus geschafft^^, weil ich die Funktionen in der WM_CREATE Message ausgeführt habe.
Aber sobald ich accept() auch noch in die WM_CrATE Message packe öffnet sich nichtmal das Fenster ^^ -.-
Habt ihr da eine idee?? _________________ Besucht meine Seite:
www.cpparchiv.dl.am |
|
Nach oben |
|
|
Faller Junior JLI'ler
Alter: 36 Anmeldedatum: 30.11.2006 Beiträge: 88 Wohnort: Dresden Medaillen: Keine
|
Verfasst am: 12.11.2007, 14:02 Titel: |
|
|
accept ist ein plockierender befehl das heist er wartet da bis es ein socket gibt zum aktzeptieren auf teufel komm raus hundert jahre.
du must um das acept wie all die anahme und senden befehle selects drumerrum bauen um diese blockierende befehle nur zu nutzen wenn man sie brauch.
mfg Faller _________________ versuche alles nur wann und wie ist die frage |
|
Nach oben |
|
|
RebornX JLI'ler
Anmeldedatum: 16.03.2007 Beiträge: 169
Medaillen: Keine
|
Verfasst am: 12.11.2007, 14:19 Titel: |
|
|
Faller hat Folgendes geschrieben: | accept ist ein plockierender befehl das heist er wartet da bis es ein socket gibt zum aktzeptieren auf teufel komm raus hundert jahre.
du must um das acept wie all die anahme und senden befehle selects drumerrum bauen um diese blockierende befehle nur zu nutzen wenn man sie brauch.
mfg Faller |
Heißt das jetzt, dass ich eine zweite Callback funktion dafür schreiben muss??
Also accept ist denk ich eine Funktion die ich die ganze zeit brauche, weil das ListView Control dadrüber soll ja eine Server Liste darstellen^^, wo dann die Server aufgelistet werden, wenn sie zu mir connecten...
Dh. der Client muss durchgehend prüfen ob ein Server zu mir connecten will^^ oda liege ich da etwa falsch?? _________________ Besucht meine Seite:
www.cpparchiv.dl.am |
|
Nach oben |
|
|
Jonathan_Klein Living Legend
Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 12.11.2007, 14:41 Titel: |
|
|
Es gibt eine Funktion mit der du testen kannst, ob ein Socket etwas neues hat. Daher du kannst vor dem Aufruf von accept testen, ob schon was da ist, er also sofort zurückkehren würde, oder ob nichts da ist, accpt also auf unbestimmte Zeit wartet. _________________ https://jonathank.de/games/ |
|
Nach oben |
|
|
RebornX JLI'ler
Anmeldedatum: 16.03.2007 Beiträge: 169
Medaillen: Keine
|
Verfasst am: 12.11.2007, 14:45 Titel: |
|
|
Jonathan_Klein hat Folgendes geschrieben: | Es gibt eine Funktion mit der du testen kannst, ob ein Socket etwas neues hat. Daher du kannst vor dem Aufruf von accept testen, ob schon was da ist, er also sofort zurückkehren würde, oder ob nichts da ist, accpt also auf unbestimmte Zeit wartet. |
hmm, kennt jemand die Funktion?? _________________ Besucht meine Seite:
www.cpparchiv.dl.am |
|
Nach oben |
|
|
PeaceKiller JLI Master
Alter: 35 Anmeldedatum: 28.11.2002 Beiträge: 970
Medaillen: Keine
|
Verfasst am: 12.11.2007, 14:51 Titel: |
|
|
RebornX hat Folgendes geschrieben: | Jonathan_Klein hat Folgendes geschrieben: | Es gibt eine Funktion mit der du testen kannst, ob ein Socket etwas neues hat. Daher du kannst vor dem Aufruf von accept testen, ob schon was da ist, er also sofort zurückkehren würde, oder ob nichts da ist, accpt also auf unbestimmte Zeit wartet. |
hmm, kennt jemand die Funktion?? |
Allerdings solltest du dein Programm wahrscheinlich ganz anders aufbauen. Weil nie ganze Zeit einfach immer wieder abzufragen, ob etwas neues auf dem Socket passiert ist, ist sehr schlechter Stil. _________________ »If the automobile had followed the same development cycle as the computer, a Rolls-Royce would today cost $100, get a million miles per gallon, and explode once a year, killing everyone inside.«
– Robert X. Cringely, InfoWorld magazine |
|
Nach oben |
|
|
Jonathan_Klein Living Legend
Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
|
Nach oben |
|
|
RebornX JLI'ler
Anmeldedatum: 16.03.2007 Beiträge: 169
Medaillen: Keine
|
Verfasst am: 12.11.2007, 15:00 Titel: |
|
|
PeaceKiller hat Folgendes geschrieben: |
Allerdings solltest du dein Programm wahrscheinlich ganz anders aufbauen. Weil nie ganze Zeit einfach immer wieder abzufragen, ob etwas neues auf dem Socket passiert ist, ist sehr schlechter Stil. |
wie meinst du das? Soll ich nur im 5 Minuten takt abfragen oder wie ?
Weil das wäre ja wiederrum nicht so toll für ein chat^^ Dann muss man immer 5 min warten bis man eine verbindung hat...
edit://
Doch ^^ ich habe dieses c-worker tutorial mal durchgenommen^^ ich lese mir diese^^ tutorials auch nochmal durch^^ .... Die scheinen etwas aktueller zu sein... _________________ Besucht meine Seite:
www.cpparchiv.dl.am
Zuletzt bearbeitet von RebornX am 12.11.2007, 15:03, insgesamt einmal bearbeitet |
|
Nach oben |
|
|
Jonathan_Klein Living Legend
Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 12.11.2007, 15:01 Titel: |
|
|
Ich habs damals glaub ich mal über Timer gemacht. Jede Sekunde abgefragt. Da verbindet man trotzdem sehr schnell und ist net die ganze Zeit am nachgucken. _________________ https://jonathank.de/games/ |
|
Nach oben |
|
|
PeaceKiller JLI Master
Alter: 35 Anmeldedatum: 28.11.2002 Beiträge: 970
Medaillen: Keine
|
Verfasst am: 12.11.2007, 15:45 Titel: |
|
|
select() blockiert ja bis etwas auf deinem Socket passiert. Das Problem ist, dass du in der Zeit nicht auf Windows-Nachrichten reagieren kannst.
Das Thema ist nicht ganz einfach gescheit zu lösen. Vielleicht hilft dir:
http://tangentsoft.net/wskfaq/articles/io-strategies.html
Oder I/O Completion Ports:
http://www.microsoft.com/technet/sysinternals/information/IoCompletionPorts.mspx
Mit der WaitForMultipleObjects-API solltest du auch auf Windows- und Netzwerknachrichten gleichzeitig warten können. _________________ »If the automobile had followed the same development cycle as the computer, a Rolls-Royce would today cost $100, get a million miles per gallon, and explode once a year, killing everyone inside.«
– Robert X. Cringely, InfoWorld magazine |
|
Nach oben |
|
|
RebornX JLI'ler
Anmeldedatum: 16.03.2007 Beiträge: 169
Medaillen: Keine
|
Verfasst am: 13.11.2007, 18:23 Titel: |
|
|
Sooo
ich habe jetzt ein bischen (was heißt ein bisschen ... SEHR VIEL) rumrecherchiert:
Also select() ist zwar gut^^ aba WSAAsyncSelect() ist besser xD
Zumindest für WinApi Anwendungen^^ (hab ich i-wo gelesen^^)
Jedoch habe ich nicht so richtig verstanden was WSAAsyncSelect eigentlich macht???
Zitat: | The Windows Sockets WSAAsyncSelect function requests Windows message-based notification of network events for a socket. |
Heißt das jetzt, dass die Funktion WSAAsyncSelect WinSocks erlaubt wie Windows-Messages (zB. WM_PAINT, WM_COMMAND usw..) auf Verbindungen von außen zu reagieren???
Wie ich mir das Vorstelle:
Ein Server besitzt einen Socket: "AcceptSocket"
"AcceptSocket" ist an einen Port gebunden und im Listen-Modus...
Dann wird "AcceptSocket" in WSAAsyncSelect() reingepackt:
CPP: | WSAAsyncSelect(AcceptSocket, hWnd, WM_SOCKET, FD_ACCEPT | FD_WRITE | FD_READ | FD_CLOSE); |
Sobald dann ein Client versucht auf den server zu connecten o.ä, sendet Windows die passende Message: FD_READ, FD_CLOSE, FD_CONNECT usw^^
Ich weiß jetzt nicht was die message auf: "Eingehende verbindung von Außen" ist, deswegen sag ich jetzt einfach mal das ist die "FD_CONNECT" Message^^ Wenn dann halt sone message ankommt kann man in "FD_CONNECT" die accept() Funktion einmal (!) ausführen, sodass nixx blockiert wird^^
Dann gibt accept einen socket zurück usw....
So in der Art läuft das auch mit den aderen Blocking Calls recv(), send() usw...
Ist das so richtig??
Oda bin ich auf dem völlig falschen pfad??? _________________ Besucht meine Seite:
www.cpparchiv.dl.am |
|
Nach oben |
|
|
RebornX JLI'ler
Anmeldedatum: 16.03.2007 Beiträge: 169
Medaillen: Keine
|
Verfasst am: 14.11.2007, 16:37 Titel: |
|
|
Nagut diese frage da hat sich geklärt^^
habe jetzt aber eine andere:
Wie kann ich mit connect() in regelmäßigen zeitabständen prüfen ob der server da ist, ohne zu blockieren?
Ich habe es mit einer Schleife und sleep probiert, doch da wird logischer Weise bockiert -.-
Kennt jemand eine bessere Lösung?? _________________ Besucht meine Seite:
www.cpparchiv.dl.am |
|
Nach oben |
|
|
Jonathan_Klein Living Legend
Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 14.11.2007, 16:41 Titel: |
|
|
aber du weißt mittlerweile schon wofür select da ist??? _________________ https://jonathank.de/games/ |
|
Nach oben |
|
|
RebornX JLI'ler
Anmeldedatum: 16.03.2007 Beiträge: 169
Medaillen: Keine
|
Verfasst am: 14.11.2007, 16:44 Titel: |
|
|
Jonathan_Klein hat Folgendes geschrieben: | aber du weißt mittlerweile schon wofür select da ist??? |
ja ^^ also fast ^^.... der ehm naja... ich kann es nicht erklären^^ _________________ Besucht meine Seite:
www.cpparchiv.dl.am |
|
Nach oben |
|
|
PeaceKiller JLI Master
Alter: 35 Anmeldedatum: 28.11.2002 Beiträge: 970
Medaillen: Keine
|
Verfasst am: 14.11.2007, 16:46 Titel: |
|
|
http://msdn2.microsoft.com/en-us/library/ms737625.aspx
Zitat: | If the application is using WSAAsyncSelect to indicate interest in connection events, then the application will receive an FD_CONNECT notification indicating that the connect operation is complete (successfully or not). |
_________________ »If the automobile had followed the same development cycle as the computer, a Rolls-Royce would today cost $100, get a million miles per gallon, and explode once a year, killing everyone inside.«
– Robert X. Cringely, InfoWorld magazine |
|
Nach oben |
|
|
|