Problem mit ClientSocket
-
Guten Tag,
ich habe da ein kleines Problem, dessen Ursache ich kenne
aber leider keine Lösung habe.Zum meinem Programm
Ich benutze eine ClientSocket und eine ServerSocket Kopmo
(Borland 6 pof. Internet).Der Client versucht sich alle 5 sec mit einem Server zu verbinden.
Dieses mache ich im dem ich den ClientSockte->Aktive auf true setzte.Wenn die Verbindung nicht aufgebaut werden kann Werte ich die Fehlermeldung
von OnError aus.Damit gehe ich hin und setze am ende der Funktion denn
ErrorCode auf 0;Danach ClientSockte->Aktive auf false, und zu letzt ClientSocket->Close();
Nach 5sec. versuche ich die Verbindung wieder auf zubauen.
Soweit klappt eigentlich auch alles.Es kann aber sein daß, das Programm ein paar Tage lang keine Verbindung aubauen kann.
DANN schließt es sich selber (was mein Problem ist !!!!!!!!!!!!).
Ich habe festgestellt das mit jedem Verbindung Versuch der Handelns wert im
Task-Manager hoch zählt.Wie kann ich nun Sicherstellen das bei einem gescheiterten Verbindungsversuch
auch der Handelns wieder Freigegeben wird !!!!!!!!!das
ClientSocket->Aktive = false; und ClientSocket->Close();
reicht leider nicht aus.Wenn ich mein Programm beende wird der Handleswert wieder zurück gesetzt.
mfG
MasterBratak[ Dieser Beitrag wurde am 19.03.2003 um 19:31 Uhr von MasterBratak editiert. ]
-
Hi du
Also ich bin jetzt kein Spezi im Thema Sockets, aber ich versuche zu helfen.
Kannst du viellecht den Code mal pasten? Hast du dir das ganze schon ma im Debugger angesehn?
-
So hier ist mal ein beispiel..
mann brauch
1. Label
1. Button
1. ClientSocket
evtl. 1 timerZum Simmulieren des Fehlers reicht es aus, den ClientSocket immer wiede auf
Aktive zu setzen.Schaut man sich nun im Task-Manager den Handelwert an sieht mann wie dieser mit , jedem Verbindungsversuch hochgezählt wird, und erst mit dem Beenden des
Programms zurückgesetzt wird.//--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include "Unit1.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TForm1::ClientSocket1Error(TObject *Sender, TCustomWinSocket *Socket, TErrorEvent ErrorEvent, int &ErrorCode) { switch(ErrorEvent) { case eeSend: { break; } case eeReceive: { break; } case eeConnect: { ClientTimer->Enabled = true; break; } case eeDisconnect: { ClientTimer->Enabled = true; break; } case eeAccept: { // Nur für Serversocket relevant break; } case eeGeneral: { // Hier einen Timer starten der wieder die Socketverbindung öffnet // Einen Timer deshalb, damit das System das alte Socket auflösen kann // Ich habe ein Timeout von 5 Sekunden eingebaut ClientTimer->Enabled = true; break; } default : { // Hier einen Timer starten der wieder die Socketverbindung öffnet // Einen Timer deshalb, damit das System das alte Socket auflösen kann // Ich habe ein Timeout von 5 Sekunden eingebaut ClientTimer->Enabled = true; } } //Wichtig !!!!!!!! //Damit der Programmablauf wieder aufgenommen wird, die Variable auf Null setzen ErrorCode = 0; // Meldung absetzen ClientStLabel->Caption = ("Verbindungs fehler......"); // Socket beenden ClientSocket1->Active = false; ClientSocket1->Close(); } //--------------------------------------------------------------------------- void __fastcall TForm1::ClientStartButtonClick(TObject *Sender) { // Starten des Verbindungsaufbau ClientSocket1->Active = true; // Meldung absetzen ClientStLabel->Caption = ("Verbindungs versuch......"); } void __fastcall TForm1::ClientTimerTimer(TObject *Sender) { // Timer anhalten ClientTimer->Enabled = false; // Verbindungsaufbau Starten ClientStartButtonClick(Sender); }
mfG
MasterBratak
-
Schon mal probiert, Open() statt Active zu benutzen?
-
Hallo Jansen,
habe ich soeben mal gesetet,
leider ohne Erfolg.Gruss MasterBratak
-
hola leute ...
meines wissens ist es so, das er immer einen neuen port fuer eine verbindung nimmt, wobei ihm die (port)nummer eigendlich relativ egal ist. scheinbar wird die portnummer auch immer wieder neu belegt. egal ob der verbindungsaufbau positiv oder negativ ist. wenn eine verbindung abgeschlossen ist, bekommt ein socket immer einen neuen port. die ports bleiben im spicher nicht offen oder sonst wie haengen.
hab ich mal mittels softice nachgeprueft. hatte mich auch mal interessiert wie das ablaeuft. scheinbar werden "abgenuetzte" ports vom system selber immer wieder freigegeben.wenn ich hier jetzt bloedsinn verzapft haben sollte , dann berichtig mich bidde.
Deadman
-
Hallo,
( Borloandhilfe )------------------
Bestimmte Port-IDs sind für spezielle Dienste reserviert.
------------------------------------------------------Ich möchte mich über eine bestimten Prot (zb. 5611) verbinden.
Die nummer ist eigendlich immer konstant.
-
So ich habe die Lösung gefunden,
es reicht leider nicht aus den ClientSocket mit
ClientSocket1->Close();
zu beenden.
Es muss noch zusätzlich der Socket beendet werden.
Also die Lösung ist
ClientSocket1->Close(); ClientSocket1->Socket->Close();
damit Läuft der Handel nicht mehr über.
Danke noch mal an Alle.
-
ClientSocket1->Socket->Close(); allein reicht nicht?
-
Hallo,
da habe ich auch getestet,
also
ClientSocket1->Socket->Close();
reicht nicht alleine , dann laufen die Windows Handel weiter Hoch.erst mit
ClientSocket1->Close();
ClientSocket1->Socket->Close();habe ich das gewünschte ergebnis.
Warum das so kann ich nicht sagen, aber es ist erstmal die Lösung von meinem Problem.