Socket(s) auf UDP-Basis...



  • Hallo,

    Ich habe mir eine Client/Server-Applikation auf Basis von CAsyncSocket geschrieben, in der der Client dem Server ein "Paar" IP-Pakete schickt und diese vom Server sofort wieder zurückgeschickt bekommt. Mit TCP (--> SOCK_STREAM) funktioniert auch alles wunderbar, nur wenn Ich das Ganze auf UDP (--> SOCK_DGRAM) umstelle funktioniert der Datenaustausch zwischen Client u. Server nicht mehr. 😕

    Kann mir jemand weiterhelfen?

    Hier noch ein bisschen Code:

    void CServerDlg::OnButtonListen() 
    {
        // Variablen mit Steuerelementen synchronisieren
        UpdateData(TRUE);   
    
        // Steuerelemente deaktivieren
        GetDlgItem(IDC_RADIO_TCP)->EnableWindow(FALSE);
        GetDlgItem(IDC_RADIO_UDP)->EnableWindow(FALSE);
        GetDlgItem(IDC_EDIT_PORTNUMBER)->EnableWindow(FALSE);
        GetDlgItem(IDC_SPIN_PORTINC)->EnableWindow(FALSE);
        GetDlgItem(IDC_BUTTON_LISTEN)->EnableWindow(FALSE);
        GetDlgItem(IDC_BUTTON_EXIT)->EnableWindow(FALSE);
        GetDlgItem(IDC_BUTTON_ABOUT)->EnableWindow(FALSE);
    
        GetDlgItem(IDC_BUTTON_STOP)->EnableWindow(TRUE);
    
        // wurde TCP oder UDP ausgewählt?
        if (m_iSocketType == 0)
        {
            /**
             * TCP
             */
            // Socket erzeugen
            m_sListenSocket.Create(m_iPortnumber, SOCK_STREAM);
    
            // auf Verbindungsanfragen warten
            m_sListenSocket.Listen();
        }
        else
        {
            /**
             * UDP
             */     
            // Socket erzeugen
            m_sListenSocket.Create(m_iPortnumber, SOCK_DGRAM);
    
            struct sockaddr_in addr;
    
            addr.sin_family = AF_INET;
            addr.sin_port = htons(m_iPortnumber);
            addr.sin_addr.S_un.S_addr = INADDR_ANY;
    
            m_sListenSocket.Bind((const sockaddr*)&addr, sizeof(addr));     
        }
    }
    

    Hierbei handelt es sich um die Server-Seite... - offenbar muss Ich bei UDP " Bind" anstelle von "Listen" verwenden... aber leider funktioniert es trotzdem nicht.



  • Hi,

    hat vielleicht einer von Euch ein Beispiel für die Verwendung von UDP-Socket(s) unter Verwendung von MFC (--> CAsyncSocket)?

    Oder kann mir jemand einen Tipp geben, wie Ich bei Verwendung von UDP vorgehen muss (TCP funktioniert wunderbar)...

    Ciao,
    -Jackler



  • Hallo,

    hab' nun auch mit UDP hinbekommen... 🙂

    void CServerDlg::OnButtonListen() 
    {
        // Variablen mit Steuerelementen synchronisieren
        UpdateData(TRUE);   
    
        // Steuerelemente deaktivieren
        GetDlgItem(IDC_RADIO_TCP)->EnableWindow(FALSE);
        GetDlgItem(IDC_RADIO_UDP)->EnableWindow(FALSE);
        GetDlgItem(IDC_EDIT_PORTNUMBER)->EnableWindow(FALSE);
        GetDlgItem(IDC_SPIN_PORTINC)->EnableWindow(FALSE);
        GetDlgItem(IDC_BUTTON_LISTEN)->EnableWindow(FALSE);
        GetDlgItem(IDC_BUTTON_EXIT)->EnableWindow(FALSE);
        GetDlgItem(IDC_BUTTON_ABOUT)->EnableWindow(FALSE);
    
        GetDlgItem(IDC_BUTTON_STOP)->EnableWindow(TRUE);
    
        // wurde TCP oder UDP ausgewählt?
        if (m_iSocketType == 0)
        {
            /**
             * TCP
             */
            // Socket erzeugen
        m_sListenSocket.Create(m_iPortnumber, SOCK_STREAM);
    
        // auf Verbindungsanfragen warten
        m_sListenSocket.Listen();
        }
        else
        {
            /**
         * UDP
         */     
        // Socket erzeugen
        m_sListenSocket.Create(m_iPortnumber, SOCK_DGRAM);
    
        struct sockaddr_in addr;
    
        // zuerst alles auf 0 setzen
        memset(&addr, 0, sizeof(addr));
    
        addr.sin_family = AF_INET;
        addr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
        addr.sin_port = htons(m_iPortnumber);
    
        // Socket binden
        m_sListenSocket.Bind((struct sockaddr*)&addr, sizeof(addr));        
        }
    }
    

    Noch ganz wichtig, die Funktion OnReceive():

    void CServerDlg::OnReceive()
    {
        char *pBuf = new char[1025];
        int iBufSize = 1024;
        CString strRcvd;
        int iRcvd, iSent;
    
        // wurde TCP oder UDP ausgewählt?
        if (m_iSocketType == 0)
        {
            /**
             * TCP
         */
        int iLen;
    
        // 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
            strRcvd = pBuf;
    
                iLen = strRcvd.GetLength();
    
            // Nachricht senden
            iSent = m_sConnectSocket.Send(LPCTSTR(strRcvd), iLen);      
        }
        }
        else
        {
            /**
         * UDP
         */     
        int laddr;
    
        struct sockaddr_in addr;
        struct sockaddr *paddr;
    
        // zuerst alles auf 0 setzen
        memset(&addr, 0, sizeof(addr));
    
        addr.sin_family = AF_INET;
        addr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
        addr.sin_port = htons(m_iPortnumber);
    
        paddr = (struct sockaddr*)&addr;
        laddr = sizeof(addr);
    
        // Empfangen... --> recvfrom
        iRcvd = m_sListenSocket.ReceiveFrom(pBuf, iBufSize, paddr, &laddr);
    
        // Wurde etwas empfangen?
        if(iRcvd == SOCKET_ERROR)
        {
        }
        else
        {
            // Ende der Nachricht abschneiden
            pBuf[iRcvd] = NULL;
    
            // Senden... --> sendto
            iSent = m_sListenSocket.SendTo(pBuf, iBufSize, paddr, sizeof(addr));
        }
        }
    }
    

Anmelden zum Antworten