Verbindung SOCKET klappt net....



  • Hi Leutz!!
    Ich machte alles nach Tutorial von www.mut.de
    Mein Programm SOCK.EXE führte ich 2mal aus, steht da, dann sollte man verbinden können. Macht alles ja, nur eine verbindung kriegt der nich zu stande!

    Hier der Code für die Klasse "CMySocket":

    // MySocket.cpp: Implementierungsdatei
    //
    
    #include "stdafx.h"
    #include "Sock.h"
    #include "MySocket.h"
    #include "SockDlg.h"
    
    #ifdef _DEBUG
    #define new DEBUG_NEW
    #undef THIS_FILE
    static char THIS_FILE[] = __FILE__;
    #endif
    
    /////////////////////////////////////////////////////////////////////////////
    // CMySocket
    
    CMySocket::CMySocket()
    {
    }
    
    CMySocket::~CMySocket()
    {
    }
    
    //Die folgenden Zeilen nicht bearbeiten. Sie werden vom Klassen-Assistenten benötigt.
    #if 0
    BEGIN_MESSAGE_MAP(CMySocket, CAsyncSocket)
        //{{AFX_MSG_MAP(CMySocket)
        //}}AFX_MSG_MAP
    END_MESSAGE_MAP()
    #endif  // 0
    
    /////////////////////////////////////////////////////////////////////////////
    // Member-Funktion CMySocket 
    
    void CMySocket::SetParent(CDialog *pWnd)
    {
    m_pWnd = pWnd;
    }
    
     void CMySocket::OnAccept(int nErrorCode)
    {
     if (nErrorCode == 0)
     ((CSockDlg*)m_pWnd)->OnAccept;
    }
    
    void CMySocket::OnConnect()
    {
    
    }
    
    void CMySocket::OnClose()
    {
    
    }
    
    void CMySocket::OnReceive()
    {
    
    }
    
    void CMySocket::OnSend()
    {
    
    }
    

    Und noch der Code von "CSockDlg": (Nur in diesen 2 musste ich sachen machen! Beim kompilieren 0 Fehler, 0 Warnungen...)
    [cpp]
    // SockDlg.cpp : Implementierungsdatei
    //

    #include "stdafx.h"
    #include "Sock.h"
    #include "SockDlg.h"

    #ifdef DEBUG
    #define new DEBUG_NEW
    #undef THIS_FILE
    static char THIS_FILE[] = __FILE
    _;
    #endif

    /////////////////////////////////////////////////////////////////////////////
    // CAboutDlg-Dialogfeld für Anwendungsbefehl "Info"

    class CAboutDlg : public CDialog
    {
    public:
    CAboutDlg();

    // Dialogfelddaten
    //{{AFX_DATA(CAboutDlg)
    enum { IDD = IDD_ABOUTBOX };
    //}}AFX_DATA

    // Vom Klassenassistenten generierte Überladungen virtueller Funktionen
    //{{AFX_VIRTUAL(CAboutDlg)
    protected:
    virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV-Unterstützung
    //}}AFX_VIRTUAL

    // Implementierung
    protected:
    //{{AFX_MSG(CAboutDlg)
    //}}AFX_MSG
    DECLARE_MESSAGE_MAP()
    };

    CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
    {
    //{{AFX_DATA_INIT(CAboutDlg)
    //}}AFX_DATA_INIT
    }

    void CAboutDlg::DoDataExchange(CDataExchange* pDX)
    {
    CDialog::DoDataExchange(pDX);
    //{{AFX_DATA_MAP(CAboutDlg)
    //}}AFX_DATA_MAP
    }

    BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
    //{{AFX_MSG_MAP(CAboutDlg)
    // Keine Nachrichten-Handler
    //}}AFX_MSG_MAP
    END_MESSAGE_MAP()

    /////////////////////////////////////////////////////////////////////////////
    // CSockDlg Dialogfeld

    CSockDlg::CSockDlg(CWnd* pParent /=NULL/)
    : CDialog(CSockDlg::IDD, pParent)
    {
    //{{AFX_DATA_INIT(CSockDlg)
    m_strMessage = _T("");
    m_strName = _T("");
    m_iPort = 0;
    m_iType = -1;
    //}}AFX_DATA_INIT
    // Beachten Sie, dass LoadIcon unter Win32 keinen nachfolgenden DestroyIcon-Aufruf benötigt
    m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
    }

    void CSockDlg::DoDataExchange(CDataExchange* pDX)
    {
    CDialog::DoDataExchange(pDX);
    //{{AFX_DATA_MAP(CSockDlg)
    DDX_Control(pDX, IDC_LSENT, m_ctlSent);
    DDX_Control(pDX, IDC_LRECVD, m_ctlRecvd);
    DDX_Control(pDX, IDC_BCONNECT, m_ctlConnect);
    DDX_Text(pDX, IDC_EMSG, m_strMessage);
    DDX_Text(pDX, IDC_ESERVERNAME, m_strName);
    DDX_Text(pDX, IDC_ESERVPORT, m_iPort);
    DDX_Radio(pDX, IDC_RCLIENT, m_iType);
    //}}AFX_DATA_MAP
    }

    BEGIN_MESSAGE_MAP(CSockDlg, CDialog)
    //{{AFX_MSG_MAP(CSockDlg)
    ON_WM_SYSCOMMAND()
    ON_WM_PAINT()
    ON_WM_QUERYDRAGICON()
    ON_BN_CLICKED(IDC_RCLIENT, OnRType)
    ON_BN_CLICKED(IDC_RSERVER, OnRType)
    ON_BN_CLICKED(IDC_BCONNECT, OnBconnect)
    //}}AFX_MSG_MAP
    END_MESSAGE_MAP()

    /////////////////////////////////////////////////////////////////////////////
    // CSockDlg Nachrichten-Handler

    BOOL CSockDlg::OnInitDialog()
    {
    CDialog::OnInitDialog();

    // Hinzufügen des Menübefehls "Info..." zum Systemmenü.

    // IDM_ABOUTBOX muss sich im Bereich der Systembefehle befinden.
    ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
    ASSERT(IDM_ABOUTBOX < 0xF000);

    CMenu* pSysMenu = GetSystemMenu(FALSE);
    if (pSysMenu != NULL)
    {
    CString strAboutMenu;
    strAboutMenu.LoadString(IDS_ABOUTBOX);
    if (!strAboutMenu.IsEmpty())
    {
    pSysMenu->AppendMenu(MF_SEPARATOR);
    pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
    }
    }

    // Symbol für dieses Dialogfeld festlegen. Wird automatisch erledigt
    // wenn das Hauptfenster der Anwendung kein Dialogfeld ist
    SetIcon(m_hIcon, TRUE); // Großes Symbol verwenden
    SetIcon(m_hIcon, FALSE); // Kleines Symbol verwenden

    // ZU ERLEDIGEN: Hier zusätzliche Initialisierung einfügen
    m_iType=0;
    m_strName="loopback";
    m_iPort=4000;
    UpdateData(FALSE);
    m_sConnectSocket.SetParent(this);
    m_sListenSocket.SetParent(this);

    return TRUE; // Geben Sie TRUE zurück, außer ein Steuerelement soll den Fokus erhalten
    }

    void CSockDlg::OnSysCommand(UINT nID, LPARAM lParam)
    {
    if ((nID & 0xFFF0) == IDM_ABOUTBOX)
    {
    CAboutDlg dlgAbout;
    dlgAbout.DoModal();
    }
    else
    {
    CDialog::OnSysCommand(nID, lParam);
    }
    }

    // Wollen Sie Ihrem Dialogfeld eine Schaltfläche "Minimieren" hinzufügen, benötigen Sie
    // den nachstehenden Code, um das Symbol zu zeichnen. Für MFC-Anwendungen, die das
    // Dokument/Ansicht-Modell verwenden, wird dies automatisch für Sie erledigt.

    void CSockDlg::OnPaint()
    {
    if (IsIconic())
    {
    CPaintDC dc(this); // Gerätekontext für Zeichnen

    SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

    // Symbol in Client-Rechteck zentrieren
    int cxIcon = GetSystemMetrics(SM_CXICON);
    int cyIcon = GetSystemMetrics(SM_CYICON);
    CRect rect;
    GetClientRect(&rect);
    int x = (rect.Width() - cxIcon + 1) / 2;
    int y = (rect.Height() - cyIcon + 1) / 2;

    // Symbol zeichnen
    dc.DrawIcon(x, y, m_hIcon);
    }
    else
    {
    CDialog::OnPaint();
    }
    }

    // Die Systemaufrufe fragen den Cursorform ab, die angezeigt werden soll, während der Benutzer
    // das zum Symbol verkleinerte Fenster mit der Maus zieht.
    HCURSOR CSockDlg::OnQueryDragIcon()
    {
    return (HCURSOR) m_hIcon;
    }

    void CSockDlg::OnRType()
    {
    // TODO: Code für die Behandlungsroutine der Steuerelement-Benachrichtigung hier einfügen
    UpdateData(TRUE);
    if(m_iType == 0)
    m_ctlConnect.SetWindowText("&Verbinden");
    else
    m_ctlConnect.SetWindowText("&Hören");
    }

    //DEL void CSockDlg::OnAccept(int nErrorCode)
    //DEL {
    //DEL
    //DEL }

    void CSockDlg::OnBconnect()
    {
    // TODO: Code für die Behandlungsroutine der Steuerelement-Benachrichtigung hier einfügen
    UpdateData(TRUE);
    GetDlgItem(IDC_BCONNECT)->EnableWindow(FALSE);
    GetDlgItem(IDC_ESERVERNAME)->EnableWindow(FALSE);
    GetDlgItem(IDC_ESERVPORT)->EnableWindow(FALSE);
    GetDlgItem(IDC_STATICNAME)->EnableWindow(FALSE);
    GetDlgItem(IDC_STATICPORT)->EnableWindow(FALSE);
    GetDlgItem(IDC_RCLIENT)->EnableWindow(FALSE);
    GetDlgItem(IDC_RSERVER)->EnableWindow(FALSE);
    GetDlgItem(IDC_STATICTYPE)->EnableWindow(FALSE);
    //Läuft Anwendung aus Client oder Server?
    if (m_iType == 0)
    {
    //Client, einen **StandardSocket erzeugen
    m_sConnectSocket.Create();
    //Verbindung zum Server öffnen
    m_sConnectSocket.Connect(m_strName, m_iPort);
    }
    else
    {
    //Server, einen Socket für den angegeben Anschluss erzeugen
    m_sListenSocket.Create(m_iPort);
    //Auf Verbindungsgesuche hören
    m_sListenSocket.Listen();
    }
    }

    void CSockDlg::OnAccept()
    {
    m_sListenSocket.Accept(m_sConnectSocket);
    GetDlgItem(IDC_EMSG)->EnableWindow(TRUE);
    GetDlgItem(IDC_BSEND)->EnableWindow(TRUE);
    GetDlgItem(IDC_STATICMSG)->EnableWindow(TRUE);
    }

    void CSockDlg::OnConnect()
    {
    GetDlgItem(IDC_EMSG)->EnableWindow(TRUE);
    GetDlgItem(IDC_BSEND)->EnableWindow(TRUE);
    GetDlgItem(IDC_STATICMSG)->EnableWindow(TRUE);
    GetDlgItem(IDC_BCLOSE)->EnableWindow(TRUE);
    }

    void CSockDlg::OnSend()
    {

    }

    void CSockDlg::OnReceive()
    {

    }

    void CSockDlg::OnClose()
    {

    }
    [/cpp]**



  • nabend,

    sieht eigentlich richtig aus. woher weisst du, dass keine verbindung zustande kommt?



  • Original erstellt von Lightbringer:
    **nabend,

    sieht eigentlich richtig aus. woher weisst du, dass keine verbindung zustande kommt?**

    wenn eine Verbindung besteht werden Steuerelemente aktiviert bzw. deaktiviert! Daran sieht man das eigentlich nur...

    Aber das Tutorial - jedenfalls das kapitel - ist fehlerfrei, da wirst du dich wohl irgendwo vertippt haben. 🙄



  • Hmmm... Ja, könnte durchaus möglich sein.
    Danke trozdem!
    Ich werde es nochmals von vorn versuchen



  • Hi,

    ist das wirklich fehlerfrei ?
    Ich dachte da sind 2 Fehler drin ?
    Hab das Buch jetzt leider nicht hier, aber ich glaube
    bei den Bezeichnungen für den Server hat sich der Fehlerteufel
    eingeschlichen.

    Gruß Chris



  • Ich habe das "Tutorial" ebenfalls mühevoll abgetippt und hab leider das selbe Problem. Hat vielleicht jemand das Buch C++ in 21 Tagen und könnte mal das entsprechende Listing also den Original MUT Quellcode Posten.

    Es geht um Kapitel 20:
    http://download.pearsoned.de/leseecke/VCPLUS6_21Tg/data/kap20.htm

    -danke im Vorraus-
    hever



  • Hi!
    Da ich mich reinzufällig auch gerade mit Sockets beschäftige, habe ich gestern auch das tutorial gemacht. Ich glaube ich weiß wo das Problem deines Programmes ist, und zwar hier:

    void CMySocket::OnAccept(int nErrorCode)
    {
     if (nErrorCode == 0)
     ((CSockDlg*)m_pWnd)->OnAccept; <---
    }
    

    Man sieht es nicht auf den ersten blick, aber du hast hinter dem OnAccept die beiden Klammern vergessen, sollte also so aussehen:

    void CMySocket::OnAccept(int nErrorCode)
    {
     if (nErrorCode == 0)
     ((CSockDlg*)m_pWnd)->OnAccept(); <---
    }
    

    Mir ist es schon öfter Passiert das wegen den dämlichen void klammern etwas nicht funktioniert hat. Das blöde ist ja, dass der Compiler manchmal keine Fehlermeldung, geschweige denn warnung ausgibt... Probier einfach mal aus ob es jetzt klappt.

    Perner



  • Bei mir waren diese Klammern gesetzt, also naja funzt halt immer noch nicht 😞

    Könnte es irgendwie daran liegen, dass die messages OnXXX nicht richtig übermittelt werden ?


Anmelden zum Antworten