(MFC mit dem...) Socket Problem



  • Tach leutz!
    Habe eine Win Anwendung geschrieben. Soll ein Chat über Sockets werden.
    Ganze einfache Server-Client Verbindung! Aber irgendwie kommt der Text immer nicht bei den anderen an! Hier der Hautpcode:

    void CChatDlg::OnRType() 
    {
        // TODO: Code für die Behandlungsroutine der Steuerelement-Benachrichtigung hier einfügen
        // Steuerelemente mit Variablen synchronisieren
        UpdateData(TRUE);
        // Welcher Modus ist eingestellt?
        if (m_iType == 0) // Entsprechenden Text auf der Schaltfläche festlegen
            m_ctlConnect.SetWindowText("&Verbinden");
        else
            m_ctlConnect.SetWindowText("&Hören");
    
    }
    
    void CChatDlg::OnBconnect() 
    {
        // TODO: Code für die Behandlungsroutine der Steuerelement-Benachrichtigung hier einfügen
        // Variablen mit Steuerelementen synchronisieren
        UpdateData(TRUE);
        // Steuerelemente für Verbindung und Typ deaktivieren
        GetDlgItem(IDC_BCONNECT)->EnableWindow(FALSE);
        GetDlgItem(IDC_ESERVERNAME)->EnableWindow(FALSE);
        GetDlgItem(IDC_ESERVERPORT)->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);
        GetDlgItem(IDC_STATICMSG)->EnableWindow(TRUE);
        GetDlgItem(IDC_EMSG)->EnableWindow(TRUE);
        GetDlgItem(IDC_BSEND)->EnableWindow(TRUE);
        GetDlgItem(IDC_BCLOSE)->EnableWindow(TRUE);
        // Läuft Anwendung als Client oder Server?
        if (m_iType == 0)
        {
            // Client, einen Standard-Socket erzeugen
            m_sConnectSocket.Create();
            // Verbindung zum Server öffnen
            m_sConnectSocket.Connect(m_strName, m_iPort);
        }
        else
        {
            // Server, einen Socket für den angegebenen Anschluß erzeugen
            m_sListenSocket.Create(m_iPort);
            // Auf Verbindungsgesuche hören
            m_sListenSocket.Listen();
        }
    }
    
    void CChatDlg::OnAccept()
    {
        // Verbindungsanforderung annehmen
        m_sListenSocket.Accept(m_sConnectSocket);
        // Steuerelemente für Text und Nachrichten aktivieren
        GetDlgItem(IDC_EMSG)->EnableWindow(TRUE);
        GetDlgItem(IDC_BSEND)->EnableWindow(TRUE);
        GetDlgItem(IDC_STATICMSG)->EnableWindow(TRUE);
    }
    
    void CChatDlg::OnConnect()
    {
        // Steuerelemente für Text und Nachrichten aktivieren
        GetDlgItem(IDC_EMSG)->EnableWindow(TRUE);
        GetDlgItem(IDC_BSEND)->EnableWindow(TRUE);
        GetDlgItem(IDC_STATICMSG)->EnableWindow(TRUE);
        GetDlgItem(IDC_BCLOSE)->EnableWindow(TRUE);
    }
    
    void CChatDlg::OnReceive()
    {
        char *pBuf = new char[1025];
        int iBufSize = 1024;
        int iRcvd;
        CString strRecvd;
    
        // Nachricht empfangen
        iRcvd = m_sConnectSocket.Receive(pBuf, iBufSize);
        // Wurde etwas empfangen?
        if (iRcvd == SOCKET_ERROR)
        {
        }
        else
        {
            // Ende der Nachricht abschneiden
            pBuf[iRcvd] = NULL;
            // Nachricht in einen CString kopieren
            strRecvd = pBuf;
            // Nachricht in Listenfeld der empfangenen Nachrichten eintragen
            m_ctlRecvd.AddString(strRecvd);
            // Variablen mit den Steuerelementen synchronisieren
            UpdateData(FALSE);
        }
    }
    
    void CChatDlg::OnClose()
    {
        // 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_ESERVERPORT)->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);
        }
    }
    
    void CChatDlg::OnBsend() 
    {
        // TODO: Code für die Behandlungsroutine der Steuerelement-Benachrichtigung hier einfügen
        int iLen;
        int iSent;
    
        // Steuerelemente mit Variablen synchronisieren
        UpdateData(TRUE);
        // Zu sendende Nachricht vorhanden?
        if (m_strMessage != "")
        {
            // Länge der Nachricht ermitteln
            iLen = m_strMessage.GetLength();
            // Nachricht senden
            iSent = m_sConnectSocket.Send(LPCTSTR(m_strMessage), iLen);
            // Konnte die Nachricht gesendet werden?
            if (iSent == SOCKET_ERROR)
            {
                MessageBox("Nachricht konnte nicht gesendet werden!","Fehler!");
            }
            else
            {
                // Nachricht in Listenfeld hinzufügen.
                m_ctlSent.AddString(m_strMessage);
                // Variablen mit Steuerelementen synchronisieren
                UpdateData(FALSE);
            }
        }
        else
        {
                MessageBox("Gieb zuerst deine Nachricht ein!","Kein Text vorhanden!");
        }
    }
    
    void CChatDlg::OnBclose() 
    {
        // TODO: Code für die Behandlungsroutine der Steuerelement-Benachrichtigung hier einfügen
        // OnClose-Funktion aufrufen
        OnClose();
    }
    

    Wisst ihr da weiter?
    thanks,
    wer



  • Gehört nach MFC, hat nix mit Standard-C++ zu tun.


Anmelden zum Antworten