Sockets und fehler zur Laufzeit



  • Hallo
    Ich hab da ein kleines bzw grosses Problem.

    Ich habe eine Verbindung zwischen zwei Pcs, durch sockets.

    hier in diesem codeAbschnitt stellt sich heraus das der client nicht mehr da ist. Das funktioniert auch. dann wird der destruktor aufgerufen.

    if(rc1==1){ //==1 client nicht mehr da und iohne auftrag
    				clients[i].~client();
    			}
    

    der destruktor sieht so aus

    client::~client()
    {
    }
    

    Dann aber wenn sich der selbe client nocheinmal anmeldet wird zunächst noch
    diese methode aufgerufen

    void CNetzwerkClientKaSimDlg::OnAkzeptieren()    // Wird aufgerufen, wenn der Server eine Anfrage akzeptiert
    {	
    //	static int i=0;
    //  	client c;
    //	c.SetParent(this);	
    //	clients[i]=c;
      //  ListenSocket.Accept(clients[i]);    // Akzeptiert den Clienten als m_ConnectSocket
    //	i++;
    
    	for(int i=0;i<MAX_CLIENTS;i++){
    		if(clients[i]==INVALID_SOCKET){
    			 	client c;
    				c.SetParent(this);	
    				clients[i]=c;
    		    	ListenSocket.Accept(clients[i]);
    				clients[i].setzeRechnen(false);
    			    break;
    		}
    	}
    }
    

    an der stelle client[0] ist jetzt INVALID_SOCKET weil vorher da eben der destruktor aufgerufen wurde, so will ich es auch haben und das klappt auch.
    Aber wenn sich ein client anmeldet an einer stelle wo schon vorher einer mal war dann stürzt das programm ab und zwar in folgender schleife.
    Diese Schleife habe nicht ich geschrieben, sie ist von visual c++ 6.0.

    nachdem die schleife 2 oder 3 mal, bin nicht mehr ganz sicher wie oft durchlaufen wurde stürzt es dann genau hier ab.

    if (!AfxGetThread()->PumpMessage())
    

    und hier die komplette schleife

    // phase2: pump messages while available
    		do
    		{
    			ASSERT(ContinueModal());
    
    			// pump message, but quit on WM_QUIT
    			if (!AfxGetThread()->PumpMessage())
    			{
    				AfxPostQuitMessage(0);
    				return -1;
    			}
    
    			// show the window when certain special messages rec'd
    			if (bShowIdle &&
    				(pMsg->message == 0x118 || pMsg->message == WM_SYSKEYDOWN))
    			{
    				ShowWindow(SW_SHOWNORMAL);
    				UpdateWindow();
    				bShowIdle = FALSE;
    			}
    
    			if (!ContinueModal())
    				goto ExitModal;
    
    			// reset "no idle" state after pumping "normal" message
    			if (AfxGetThread()->IsIdleMessage(pMsg))
    			{
    				bIdle = TRUE;
    				lIdleCount = 0;
    			}
    
    		} while (::PeekMessage(pMsg, NULL, NULL, NULL, PM_NOREMOVE));
    	}
    

    ich hab keine Ahnung was das heissen soll.
    könnt ihr mir bitte helfen. wenn ihr auch nichts mit dem fehler anfangen könnt, könnt ihr mir
    vielleicht sagen wie ihr das immer so handhabt mit clienten die nicht mehr da sind und sich dann eben nochmal neu anmelden. damit ich das übernehmen kann.
    vielen dank im voraus
    Xadine 🙂



  • hallo ich sitze schon heute wieder 5 stunden an dem Problem. insgesamt schon ca 10 stunden.

    Ich habe im internet etwas geguckt und da stand was von
    timern, da die stören könnten
    [url]
    http://support.microsoft.com/kb/154649/de
    [/url]

    ich benutzte einen timer, so jetzt habe ich das aber auch ohne timer gemacht.
    stattdessen benutze ich einen thread. aber trotzdem kommt der selbe doofe fehler. ich habe versucht zu verstehen aber ich kanns irgendwie nach 5 stunden immer noch nicht,
    ich bitte um hilfe 😞



  • clients[i].~client();
    

    WTF?



  • hustbär schrieb:

    clients[i].~client();
    

    WTF?

    OMG ein poser.
    LOL



  • hustbaer schrieb:

    hustbär schrieb:

    clients[i].~client();
    

    WTF?

    OMG ein poser.
    LOL

    hi

    wtf? meinst du what the fuck?
    also in clients[i], speichere ich sockets, alle die sich mit dem srverSocket an port 4000 verbunden haben. dann kann ich am server Auftraege (rechnungen)an alle verfügbaren clienten verteilen. und wenn ein client nicht mehr da ist wollte ich den destruktor aufrufen, so das der platzt im vektor wieder frei für neue clienten frei ist, oder auch denselben clienten falls der sich gleich wieder anmeldet.

    ihr seht ich mache mir hier auch gedanken und frag nicht einfach so und will von euch ne komplettlösung,
    also danke nochmals für alle bemühungen.


Anmelden zum Antworten