Paralleler Server



  • Moin moin

    Ich möchte einen einfachen parallelen server basteln. Dazu erzeuge ich in meinen Dialog ein Object der Klasse CCommandSocket und starte davon die Memberfunktion listen

    void	CVisualDlg::StartListening()
    {
    	StopListening();
    
    	m_comSocket = new CCommandSocket(this);
    	SetDlgItemText(IDC_STATIC1,"StartListening");
    	if (m_comSocket)
    	{
    		if (m_comSocket->Create(COMPORT,SOCK_STREAM,FD_ACCEPT))
    		{
    			m_comSocket->Listen();
    			SetDlgItemText(IDC_STATIC1,"Server is Listening");
    
    		}
    	}
    }
    
    void CCommandSocket::OnAccept(int nErrorCode) 
    {
    	BOOL succ = FALSE;
    	do 
    	{
    	pRequest = new CRequestSocket(_pdlg);
    	AfxMessageBox("Message receive",MB_OK);
    		if ( succ = Accept( *pRequest ))
    		{
    			pRequest->AsyncSelect(FD_READ | FD_CLOSE);
    		}
    
    	}
    	while(succ);
    	pRequest->Close();
    	CAsyncSocket::OnAccept(nErrorCode);
    }
    

    Sobald das CComandSocket-Objekt eine Anforderung akzeptiert, wird eine Instanz der Klasse CRequestSocket erzeugt und die Benachrichtigung für Read- und Close-Nachrichten aktiviert.

    CRequestSocket ist ebenfalls von CAsyncSocket abgeleitet und ist für das receiven und senden von Nachrichten zuständig.

    void CRequestSocket::OnReceive(int nErrorCode) 
    {
    	int nBytes;
    
    	unsigned char	buffer[r_BufSize];
    
    	nBytes = Receive(buffer,r_BufSize);
    
    	editBuffer(nBytes,buffer);
    	if (nBytes == SOCKET_ERROR)
    	{
    		ASSERT(GetLastError() == WSAEWOULDBLOCK);
    		return;
    	}
    
    	AsyncSelect(FD_WRITE );	
    	CAsyncSocket::OnReceive(nErrorCode);
    }
    

    Aber der Server soll nur erst mal Daten empfangen.
    Kann mir mal jemand ne'kleine Erklärung geben, wie der Server mehrere Anfragen behandelt. Also so lange der Dialog existiert müssen Anfragen behandelt werden.
    Natürlich hab ich vorher in der Anwendungsklasse die Windows-Sockets initialisiert.
    Danke schon mal im voraus.

    Beste Grüsse

    gyros



  • Ich möcht quasi einfach zwischen einem Client und meinem Server die Verbindung aufrecht erhalten und das ständig zwischen den beiden Daten hin und her verschickt werden können. Aber die Verbindung darf zwischen durch nicht abbrechen. Weil bei mir nur ein Paar Daten vom Client an den Server geschickt werden und der Server sie dann auch empfängt, dannach aber der Server keine Daten mehr bekommt, obwohl der Client sendet.
    Hat irgendjemand ne'Idee?

    Danke



  • Kann mir wirklich keiner helfen???? Es ist wirklich dringend...

    gruss

    gyros



  • Moin

    Sorry... Vieleicht hab ich mich unverständlich oder etwas wirr ausgedrückt.
    Ich möchte das sich der Client an meinen Server anmeldet und der Server die Verbindung akzeptiert. Es soll dann die Verbindung zwischen Server und Client aufrecht erhalten bleiben, so dass ständig Daten versendet werden können zwischen Client und Server. Es müssen nicht immer Daten versendet werden, die Verbindung soll aber bestehend bleiben. In meinem Programm oben bekommt der Server 2 Datenpakete und dann empfängt er nichts mehr, obwohl der Client sendet.
    Kann mir da jemand einen Tip geben wie ich mein Problem lösen kann.
    Danke schon mal im voraus.

    Beste Grüsse

    gyros



  • Schließt du vieleicht irgendwo ausversehen deinen Socket?



  • Danke Chris++ für deine Antwort. Das Problem ist das die Verbindung nicht geschlossen wird sondern das der Server keine Daten mehr empfängt bzw. keine Benachrichtigung für Read mehr bekommt.

    gruss

    gyros



  • Bastel doch mal ein kleines Kompilierbares Beispiel wo der gleiche Fehler auftritt. Mit dem Code kann ich leider nicht viel anfangen (und mit zu viel Code auch nicht 😉 ).



  • Moin Chris

    Ich habs jetzt endlich hinbekommen. Wie kann man nur so'ne Plinse sein wie ich.
    Ich hab einfach nur vergessen die Benachrichtigung bei ->AsyncSelect auch für READ
    zu aktivieren(In der Klasse RequestSocket).

    void CRequestSocket::OnReceive(int nErrorCode)
    {
        int nBytes;
    
        unsigned char    buffer[r_BufSize];
    
        nBytes = Receive(buffer,r_BufSize);
    
        editBuffer(nBytes,buffer);
        if (nBytes == SOCKET_ERROR)
        {
            ASSERT(GetLastError() == WSAEWOULDBLOCK);
            return;
        }
    
        AsyncSelect(FD_WRITE | FD_READ ); <---------- DA IST DIESER BEKACKTE FEHLER
                                                      GEWESEN
        CAsyncSocket::OnReceive(nErrorCode);
    }
    

    Da versucht man tagelang irgendwas hinzubekommen mit Threads oder anderen abenteuerlichen Methoden, weil man schon an MFC und dieser ganzen Socket-Kacke zweifelt und dann merkt man das MFC doch gar nicht so schlecht ist wie alle immer sagen!!!
    Trotzdem... Danke für deine Hilfe 👍

    gruss

    gyros



  • warum rufst du überhaupt AsyncSelect in OnReceive auf? einmal nach dem akzeptieren der verbindung reicht doch.



  • Ich hab mich schon gefragt warum du nicht postest 😉 Aber gut das du den Fehler gefunden hast.


Anmelden zum Antworten