Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » VC++ / MFC » Probleme mit Sockets

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
04.06.2005, 09:16 Uhr
BlackShadow



Hallo Leute!

Ich habe nach einem Tutorial eine Clienten und einen server gebaut jedoch weder der eine noch der andere funst. Beim server habe ich ein knopf mit server starten und ein listenfeld welches mir ausgibt zb. Verbindung aufgeaut usw. m_MySocket und m_sMySecondSocket sind mit CAsyncSocket declariert worden hier der code :


C++:
void CServerDlg::OnStart()
{
    if(m_sMySocket.Create(34000))
    {
        m_ctlTest.AddString("Create erfolgreich");
        UpdateData(FALSE);
        if(m_sMySocket.Listen())
        {
            m_ctlTest.AddString("Listen erfolgreich");
            UpdateData(FALSE);
            if (m_sMySocket.Accept(m_sMySecondSocket))
            {
                m_ctlTest.AddString("Accept erfolgreich");
                UpdateData(FALSE);
            }
            else
            {
                m_ctlTest.AddString("Accept fehlgeschlagen");
                UpdateData(FALSE);
            }
        }
        else
        {
            m_ctlTest.AddString("Listen fehlgeschlagen");
            UpdateData(FALSE);
        }
    }
    else
    {
        m_ctlTest.AddString("Create gehlgeschlagen");
        UpdateData(FALSE);
    }
}



nach ausführung des programms und dücken der start taste wird mir immer gesagt da das Accept fehlgeschgen ist. kann mir jemand helfen? danke im voraus.
--
---> !! Die Zeit wird kommen !! <---

Dieser Post wurde am 04.06.2005 um 09:17 Uhr von BlackShadow editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
04.06.2005, 10:40 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


naja auf Listen geht das Socket erstmal in Wartestellung, blockiert die Anwendung aber nicht. Da du danach, wo noch kein Client verbunden hat, Accept aufrufst, schlägt dies natürlich fehl. Das beste bei CAsyncSocket ist du überlädst es und machst dir eine eigene CMyAsyncSocket-Klasse, wo du dann OnAccept und Co überschreibst und deine Verbindungsannahme und Co ausführst.
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
04.06.2005, 17:26 Uhr
BlackShadow



Aha ok kennst du ein tut dazu? ich stehe in letzter zeit nur noch auf dem schlauch und da ist es besser eine kleine anleitung zu haben.
--
---> !! Die Zeit wird kommen !! <---
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
04.06.2005, 19:46 Uhr
BlackShadow



1: void CMySocket::OnAccept(int nErrorCode)
2: {
3: // Sind Fehler aufgetreten?
4: if (nErrorCode == 0)
5: // Nein, OnAccept-Funktion des Dialogfelds aufrufen
6: ((CSockDlg*)m_pWnd)->OnAccept();
7: }

Analoge Funktionen fügen Sie der Socket-Klasse für die Funktionen OnConnect, OnClose , OnReceive und OnSend hinzu, die gleichnamige Funktionen in der Dialogfeldklasse aufrufen.

Will der mir jetzt damit sagen das ich für OnConnect die das aufrufen soll oder was?


C++:
1: void CMySocket::OnConnect(int nErrorCode)
2: {
3: // Sind Fehler aufgetreten?
4: if (nErrorCode == 0)
5: // Nein, OnConnect-Funktion des Dialogfelds aufrufen
6: ((CSockDlg*)m_pWnd)->OnConnect();
7: }



oder soll das int nErrorCode wegfallen, was sind analoge funktionen?
--
---> !! Die Zeit wird kommen !! <---
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
04.06.2005, 19:56 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


das sind nur beispiele. "Analog zu xy" bedeutet einfach "so wie bei xy"
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
04.06.2005, 20:40 Uhr
BlackShadow



Natoll und warum sacht der dat nicht gleich so ;
naja jetzt funst der server und der client wenigstens schon mahl jetzt brauxhe ich sie nur noch verbessern. was muss ich den machen damit wen ich am clienten die verbindung beende (wie auch immer) auch der server dein socket schliest?


C++:
    // Den verbundenen Socket schließen
    m_sConnectSocket.Close();
    // Steuerelemente zum Senden von Nachrichten deaktivieren
    GetDlgItem(IDC_EMSG)->EnableWindow(FALSE);
    GetDlgItem(IDC_BSEND)->EnableWindow(FALSE);
    GetDlgItem(IDC_STATICMSG)->EnableWindow(FALSE);
    GetDlgItem(IDC_BCLOSE)->EnableWindow(FALSE);
    // Läuft Anwendung im Client-Modus?
    if (m_iType == 0)
    {
        // Ja, Steuerelemente zum Konfigurieren der Verbindung aktivieren
        GetDlgItem(IDC_BCONNECT)->EnableWindow(TRUE);
        GetDlgItem(IDC_ESERVERNAME)->EnableWindow(TRUE);
        GetDlgItem(IDC_ESERVPORT)->EnableWindow(TRUE);
        GetDlgItem(IDC_STATICNAME)->EnableWindow(TRUE);
        GetDlgItem(IDC_STATICPORT)->EnableWindow(TRUE);
        GetDlgItem(IDC_RCLIENT)->EnableWindow(TRUE);
        GetDlgItem(IDC_RSERVER)->EnableWindow(TRUE);
        GetDlgItem(IDC_STATICTYPE)->EnableWindow(TRUE);
    }



diese funktionist in server und client drin aber wen der client sich abmeldet wird die verbindung vom server dennoch nicht beendet.
--
---> !! Die Zeit wird kommen !! <---

Dieser Post wurde am 04.06.2005 um 20:45 Uhr von BlackShadow editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
04.06.2005, 22:56 Uhr
BlackShadow



Ok leute das prob hat sich aufgelöst funst jetzt auch
nur jetzt habe ich ein paar neue, zb. wie kann ich es einrichten das ich mehr als einen clienten an den server binden kann, oder die fehlerbehandlung zb wen der server nicht an ist wie kann ich das erkennen und auch andere fehler quellen wie kann ich erkennen und ausgeben welche fehler vorliegen?
--
---> !! Die Zeit wird kommen !! <---
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
04.06.2005, 23:10 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


also Serverseite:

in OnAccept einfach ein Array von "Accept-Sockets" benutzen, schon hast du multiple Clients.

auf Clientseite kriegt man Fehlermeldungen beim Connect (z.b wenn der Server nicht reagiert/an ist) bei OnConnect.
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
04.06.2005, 23:37 Uhr
BlackShadow



hm ok nur wie meinst du das jetzt kannst du vieleicht mahl so ein code schnipsel in die runde werfen den ich habe im moment keinen plan mehr sorry. danke

edit:

ok das er die verbindung schliest wen er sich nicht verbinden kann habe ich gelöst war ja ganz einfach aber ne info warum es nicht ging währe gans toll. und halt noch das mit den mehreren clienten.
--
---> !! Die Zeit wird kommen !! <---

Dieser Post wurde am 04.06.2005 um 23:41 Uhr von BlackShadow editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
05.06.2005, 09:57 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


naja dein OnAccept schaut ja irgendwie in der Form aus:


C++:
CClassXY::OnAccept(...)
{
  
}



du fügst nun erstmal eine Art Client-Klasse/struct hinzu, in der Form:


C++:
struct Client {
  CClientSocket sock; // <- hier solltest du das entsprechende nehmen was du verwendet hast
};



und dann


C++:
#include <afxtempl.h>

...

class CClassXY // Deine Klasse die OnAccept enthält
{
  // ...
private:
  CPtrArray<Client> m_apClients;
};




nun schaut dann dein OnAccept so aus:


C++:
CClientSocket *AcceptSock = new CClientSocket(...);
if(Accept(AcceptSock))
{
  // accept ok
  m_apClients.Add(AcceptSock);
}



die OnClose vom CClientSocket sollte dann so aussehen:


C++:
((CClassXY*)m_pWnd)->OnClientClose(this);



und dann die im Fenster


C++:
CClassXY::OnClientClose(CClientSocket *Client)
{
  for(int x = 0; x < m_apClients.GetCount(); x++)
  {
     if(m_apClients.GetAt(x) == Client)
     {
       m_apClients.RemoveAt(x);
       delete Client;
     }
  }
}



sowas ist relativ komplex, ich hoffe ich konnte es einigermaßen erklären
--
class God : public ChuckNorris { };

Dieser Post wurde am 05.06.2005 um 09:57 Uhr von FloSoft editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ VC++ / MFC ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: