Socket-Server soll mehrere Clients akzeptieren!!!



  • mit threads komme ich klar, wollte nur wissen ob das vom sinn her geht.

    aber das hab ich jetzt nicht verstanden ^^

    ... und auch Sync kannst.

    wie meinst du das?



  • Syncronisierung der Threads falls notwendig. Ob notwendig musst du wissen da du nicht von jedem Thread immer auf den Dialog oder sonstwas zugreifen darfs ohne zu sync.



  • sorry das ich mich jetzt so blöde anstelle 😉 aber was meinst du genau mit synchronisieren der threads ??



  • Critical Sections, Events ...



  • danke, da muss ich wohl noch etwas in der msdn wühlen.

    ich habe die threads eingebaut und es läuft eigentlich ganz gut. jetzt passiert aber etwas, was ich nicht verstehe:

    zu testzwecken sende ich von einem client eine nachricht zum server, welcher darauf reagiert, indem er viele einträge in eine datenbank schreibt (dauer der funktion ca. 20 sek).

    während dieser zeit sendet ein anderer client eine nachricht um zu sehen ob sie ankommt. aber sie kommt nur an, sobald die funktion mit dem datenbankeinträgen beendet ist !?

    in OnReceive wird ein thread aufgerufen, welcher die funktion im dualogfeld startet. OnReceive wird auch sofort nach aufruf des threads geschlossen, con daher müsste der socket eigentlich wieder auf nachrichteneingang prüfen.

    ich habe von zwei clients eine funktion aufrufen lassen, in der nur eine messagebox ausgegeben wird (ergebnis waren zwei messageboxen zur gleichen zeit). das heißt dann der thread wird aufgerufen und de rsocket kann weiter empfangen.

    hoffe das problem ist klar geworden 🙄



  • Habe ein ähnliches Problem
    und bin dank diesem Artikel schon weiter gekommen.
    Doch leider habe ich jetzt ein Problem.
    Zu meinem Prog.
    In OnAccept mache ich es wie im Artikel:

    void CAdoDatabaseView::OnAccept(void)
    {
        CMySocket *mCurSock = new CMySocket(); 
    
        m_oData.Add(mCurSock); 
    
        if (m_sListenSocket.Accept(*mCurSock)) 
        { 	
    		static int nCounter;
    
    		++nCounter;
    
    		mCurSock->m_iID = nCounter;
    
        }
    }
    

    In OnReceive erstelle ich dann die Threads wie folgt:

    void CMySocket::OnReceive(int nErrorCode)
    {
    	CWinThread *mCurThread = new CWinThread(); 
    
        m_oThreads.Add(mCurThread); 
    
    	mCurThread = AfxBeginThread(((CAdoDatabaseView*)m_pWnd)->ThreadFunc,NULL,THREAD_PRIORITY_NORMAL,0,0,NULL);
    }
    

    In meiner ThreadFunc rufe ich dann OnReceive auf wie folgt:

    UINT CAdoDatabaseView::ThreadFunc(LPVOID pParam)
    {
    
    	CAdoDatabaseView *pView    = (CAdoDatabaseView *)pParam; 
    
    	pView->OnReceive();}
    

    Mein Problem entsteht dann in meiner OnReceive funktion, denn ich weiß ja nicht für welchen Socket ich Receive aufrufe.
    Im Programm aus dem Buch "Visual C++ in 21 Tagen" steht:

    // Nachricht empfangen
    	iRcvd = m_sConnectSocket.Receive(pBuf, iBufSize);
    

    Doch wie bekomme ich den ConnectSocket heraus.
    In diesem Artikel über gibt man einfach "this" in der OnReceive Funktion. Doch ich erstelle ja jetzt eine Thread, kann man in dem vielleicht irgendwie den Socket speichern sodass man weiss welcher socket es gerade ist.
    Ich hoffe ihr versteht mich
    Mfg



  • dann speicher in deinem thread einfach die adresse deines aufrufenden sockets.

    wenn du es elegant lösen willst mit setter / getter methoden.

    @(D)Evil: bin ich meinem versprechen hiermit nachgekommen ?? ^^



  • Ja so etwas habe ich mir schon gedacht.
    Doch wie?
    Ich kann doch nicht einfach zu CWinThread eine Variable hinzufügen in der ich dann die addresse speichere oder?
    Code wäre super.
    Mfg



  • Deinen Thread erstellst du so:

    CMyThread *mMyThread;
    
    	mMyThread= (CMyThread *) AfxBeginThread(RUNTIME_CLASS(CMyThread), NULL, 0, CREATE_SUSPENDED);
    
    	// Hier den Pointer an den Thread übergeben
    	// ...
    
    	mMyThread->ResumeThread();
    

    CMyThread ist natürlich von CWinThread abgeleitet. Da kannst du dann deine Adresse auch übergeben


Anmelden zum Antworten