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)); } } }