[HILFE] Sockets: Problem mit dem Verbindungsaufbau und dem Sendevorgang!
-
Hallo
Ich bin zwar absolut neu hier, hoffe aber trotzdem auf eine Antwort von euch.
Also, mein Problem ist ist, dass ich mit den Server- und ClientSocket Modulen im C++ Builder (Borland) folgendes aufrufe:
ClientSocket->Close(); ClientSocket->Address = gibEigeneIP(); ClientSocket->Open(); ClientSocket->Socket->SendText("Hallo Welt!"); ClientSocket->Close();
Mein ServerSocket gibt mir im OnClientRead-Ereigniss die Nachricht nicht in einem Memofeld aus. Der Code ist dort richtig, was ich bereits getestet habe. Ich habe mich bereits an einem extra "Sende" Thread zu schaffen gemacht, der SendText("Hallo Welt!") übernimmt.
Jedoch funktioniert dies auch nicht.Dazu ist noch zu sagen, dass ich Server- und ClientSocket in einem Programm nutze und somit auf einen externen Server verzichten möchte. Der ServerSocket wird bereits im Konstruktor aktiviert. Port, etc. sind auch alle richtig eingetragen.
Das ganze soll ein Chatprogramm werden, das keinen externen Server benötigt. Natürlich nur im lokalen Netzwerk. Soweit habe ich den Code bereits fertig, hänge jedoch an der oben geschriebenen Codezeile.
Nun die Frage an euch: An was liegt es, dass mein eigenes Programm seine eigene Nachricht nicht mehr empfängt? Muss ich vielleicht alles mit Threads aufbauen?
Liebe Grüße, Dr. Locke
-
=> Fast hätte ichs vergessen: Der ClientSocket ist auf NonBlocking eingestellt.
Meine Frage hätte ja sonst auch kaum Sinn gemacht.^^Ich hoff mir kann noch geholfen werden
-
Wenn du den Socket im Nonblocking Mode betreibst darfst du nicht direkt nach dem
Open
Aufruf Daten verschicken, weil auch der Verbindungsaufbau asynchron passiert. Erst nach demOnConnect
Event steht die Verbindung.
-
Hey
Vielen Dank für die schnelle Antwort! Hab das sofort ausprobiert und siehe da ...
Danke!Aber nun steht ich vor dem Problem, dass ich an 10 IP-Adressen hintereinander etwas senden möchte. Wenn ich nun die Open() Methode aus ClientSocket aufrufe, nun jedoch in einer For-Schleife immer und immer wieder, dann greift das OnConnect zum einen nicht in diese For-Schleife mit ein. D.h. ich muss die Close() Methode aufrufen, wobei jedoch die aktuelle Verbindung flöten geht, die ich aber doch für den Sendevorgang benötige.
Als Beispiel:
for(int i=0;i<10;i++) { ClientSocket->Close(); ClientSocket->Address = iIP[i]; //Array mit den Ziel-IP-Adressen ClientSocket->Open(); //Soll solange auf die Beendigung des Verbindungsaufbaus warten while(this->rSende != true){} ClientSocket->Close(); } //Im ClientSocket unter dem Ereigniss OnConnect: ... { this->dieSteuerung->speicherRSende(true); }
Doch so funktioniert das nicht. Gibt es keine extra Methode wie für Threads ( WaitFor() ). Klar wird, dass der ClientSocket micht als extra Thread gestartet wird.
Ich hoffe es hat jemand eine Idee...
-
Sorry, es muss natürich so lauten:
//Im ClientSocket unter dem Ereigniss OnConnect: ... { ClientSocket->Socket->SendText("Hallo Welt!"); this->dieSteuerung->speicherRSende(true); //Speichert in rSende true! }
p.s. tolle Community! Nun bin ich auch mit dabei.
-
Hat denn keiner eine Idee?
-
Hallo
Das liegt anscheinend daran, das niemand dein Problem versteht. Eventuell hilft es ja, wenn du es nochmal anders formulierst.
bis bald
akari
-
Hmm.. könnte natürlich auch sein -.-
Also nochmal:
Ich möchte an 10 unterschiedliche IPs eine Nachricht senden, bei denen ich aber nicht weiß, ob diese einen Server besitzen, der die Nachricht entgegennehmen kann. Deshalb ist der ClientSocket asynchron (NonBlocking) eingestellt.
Der Tipp den Verbindungsaufbau auf das Ereigniss OnConnect des ClientSockets zu überprüfen habe ich versucht so um zu setzten, dass wenn die For-Schleife, die die oben genannten 10 IPs abklappern soll, eine Verbindung mit ClientSocket->Open() versucht auf zu bauen, diese solange offen halten muss, bis in OnConnect die Nachricht versendet wurde. Wenn dies nicht überprüft werden würde, dann öffnet mir das Programm die Verbindung, schließt sie aber sofort wieder bevor die Nachricht gesendet werden konnte.Außerdem ist meine Frage auch auf den Ablauf des Programmes bezogen:
Ist es möglich, dass wenn das Hauptprogramm in einer While-Schleife hängt, der ClientSocket immernoch und vorallem währendessen die OnConnect-Aktion ausführt und somit die Variable verändern kann, die in der While-Schleife abgefragt wird.Im Grunde suche ich nur nach einer Lösung, wie man an 10 IPs in einer For-Schleife hintereinander eine Nachricht verschicken kann.
Hoffentlich reicht das nun aus um mein Anliegen ein für alle mal aus der Welt zu schaffen.
Haut rein!
-
Hallo
Ich glaube du hast das mit dem asynchron noch nicht verstanden. Die For-Schleife kann zwar das Open() ausführen, aber eben nicht auf eine Antwort warten. Jedwelige Reaktion auf das Open muß in dem OnConnect oder in einem OnError passieren.
bis bald
akari
-
Hattest recht, ich hatte das ein bisschen anderst verstanden.^^
Habs nun fertig und läuft echt super! Danke!bis bald