serversocket fejler når klienter fjernes uden disconnect
Hey
Jeg har lavet et chat program baseret på borlands eksempel, det der ligger i Cbuilder6. Det spiller også max. Problemet opstår når en af klienterne logger af uden at sige ”pænt” farvel til serven. Eksempel vis hvis man lukker klienten fra proceslisten. Når serveren så skal sende ud til klienterne igen sender også til den klient som ikke længere findes, dette resultere at serveren går ned.
Jeg kan detektere at der er opstået en fejl. Men hvordan får jeg slettet forbindelsen til den klient som er blevet ”væk”??
Når klienten lukker uden at sende et "farvel", så sker der det at dit receive loop begynder at kører uendeligt, fordi den bare modtager "\0" konstant, så derfor kan du f.eks. gøre således at hvis inputtet fra dit receive er == \0 så skal den udføre et closesocket(ID).
Har været lidt væk fra PC men er tilbage nu. Det du skriver, giver god mening men jeg kan ikke lige se hvordan det kan implementeres. Derfor lige lidt server kode. Har prøvet at lave noget ligende dit forslag nede i MyServerClientError eventen.
Caption = MyServer->Port; // Sætter caption til port nr MyServer->Active = true; // Aktivere server StopButton->Enabled = true; // Gør Stopknappen synlig StartButton->Enabled = false; // Gør Startknappen usynlig PortEdit->Enabled = false; // Gør at ændring af port ikke er mulig //LogMemo->Lines->LoadFromFile("log.txt"); // Loader log.txt ved start af server } //------------------------------------------------------------------------------ void __fastcall TForm1::StopButtonClick(TObject *Sender) { MyServer->Active = false; // Deaktivere server StartButton->Enabled = true; // Gør Startknappen synlig StopButton->Enabled = false; // Gør Stopknappen usynlig PortEdit->Enabled = true; // Gør at det er muligt at ændre port } //------------------------------------------------------------------------------ void __fastcall TForm1::MyServerClientConnect(TObject *Sender, TCustomWinSocket *Socket) { LogMemo->Lines->Add(Socket->RemoteAddress + " has connected."); // Den skriver på skærmen hvem der har connected. ConnectedList->AddObject(Socket->RemoteAddress, Socket); // Opdaterer ConnectedList. } //------------------------------------------------------------------------------ void __fastcall TForm1::MyServerClientDisconnect(TObject *Sender, TCustomWinSocket *Socket) { AnsiString bruger = Format("%s",OPENARRAY(TVarRec,(ConnectedList->Strings[ConnectedList->IndexOfObject(Socket)]))); int slet_socket = Memoadr->Lines->IndexOf(ConnectedList->IndexOfObject(Socket));
LogMemo->Lines->Add(Socket->RemoteAddress + " er logget af."); SendMessage(Format("%s er logget af.", OPENARRAY(TVarRec, (ConnectedList->Strings[ConnectedList->IndexOfObject(Socket)]))), "Server"); // Den skriver på skærmen hvem der har Disconnected ConnectedList->Delete(ConnectedList->IndexOfObject(Socket)); // Opdatere ConnectedList
if(iIndex == -1 ) // Hvis brugeren er disconnected return;
if(TextIn.Pos("UserName=") == 1) { //Set User Name UserName->Text = TextIn; // User Name oprettes ConnectedList->Strings[iIndex] = UserName->Values["UserName"]; UserMemo->Lines->Add(UserName->Values["UserName"]); Memoadr->Lines->Add(ConnectedList->IndexOfObject(Socket)); SendMessage(Format("%s er logget på.", OPENARRAY(TVarRec, (UserName->Values["UserName"]))),"Server"); // User name skrives på skærmen efterfulgt af has // connected. User Name placeres i SendUsers(""); commando = true; }
if(TextIn.Pos("<specuser>") == 1) { AnsiString Tekst = TextIn; int spect = NULL;
Altså, jeg har ikke så meget forstand på C++ igen, men med at lukke på \0 løste mit eget problem da jeg lavede noget lignende .. Men kan en timeout på en socket ikke være en løsning?
Men er det ikke forholdsvist simpelt? Hvor henne i koden modtager du inputtet? Når du modtager inputtet, tjekker du om inputtet er == '\0' .. Hvis sandt, så luk forbindelsen, ellers fortsæt :)
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.