UDP Send and Receive Using CAsyncSocket

CK1820 
Created at Aug 28, 2007 01:42:52 
48   0   0   0  
The following is sample code showing use of CAsyncSocket to send and receive UDP packets. I used the ClassWizard to create a class (CUDPSocket) derived from CAsyncSocket. The derived class does little more than override OnReceive. The derived class is used in the application's document.


Sample Code


File stdafx.h
#pragma once

#define VC_EXTRALEAN
#include <afxwin.h>
#include <afxsock.h>
#include <afxcmn.h>


File UDPSocket.h
class CSendReceiveDocument;

class CUDPSocket : public CAsyncSocket
{
public:
    CSendReceiveDocument *m_pDocument; // public for debugging
    CUDPSocket() : m_pDocument(NULL) {};
    virtual ~CUDPSocket() {};
    void SetDocument(CSendReceiveDocument *pDocument) {m_pDocument=pDocument;};
    void Close() {CAsyncSocket::Close();};

    // ClassWizard generated virtual function overrides
    //{{AFX_VIRTUAL(CUDPSocket)
    public:
    virtual void OnReceive(int nErrorCode);
    //}}AFX_VIRTUAL

    // Generated message map functions
    //{{AFX_MSG(CUDPSocket)
        // NOTE - the ClassWizard will add and remove member functions here.
    //}}AFX_MSG
};


File UDPSocket.cpp
void CUDPSocket::OnReceive(int nErrorCode)
{
    CString IPAddress;
    char Buffer[512]; // Increase size as needed
    CString Message;
    DWORD Error;
    UINT Port;
    int Size;
    CAsyncSocket::OnReceive(nErrorCode);
    if (nErrorCode)
    {
        Message.Format("OnReceive nErrorCode: %i", nErrorCode);
        AfxMessageBox(Message);
        return;
    }
    Size = ReceiveFrom(Buffer, sizeof Buffer, IPAddress, Port);
    if (!Size || Size == SOCKET_ERROR)
    {
        Error = GetLastError();
        Message.Format("ReceiveFrom error code: %u", Error);
        AfxMessageBox(Message);
        return;
    }
    if (m_pDocument)
        m_pDocument->OnReceive(Buffer, Size, IPAddress, Port);
    else
        AfxMessageBox("No document pointer");
}


I am using class CSocketAddressIn to simplify use of addresses. The following is the definition.
class CSocketAddressIn : sockaddr_in
{
public:
    CSocketAddressIn()
        {ZeroMemory(this, sizeof sockaddr_in);sin_family = AF_INET;};
    CSocketAddressIn(u_long Address, u_short Port = 0);
    void SetAddress(u_long Address) {sin_addr.s_addr = htonl(Address);};
    void GetAddress(CString &s) {s=inet_ntoa(sin_addr);};
    void SetPort(u_short Port) {sin_port = htons(Port);};
    operator sockaddr *() const {return (struct sockaddr *)this;}
};


The following is the implementation of the extra constructor:
CSocketAddressIn::CSocketAddressIn(u_long Address, u_short Port)
{
    sin_family = AF_INET;
    sin_addr.s_addr = htonl(Address);
    sin_port = htons(Port);
    ZeroMemory(sin_zero, sizeof sin_zero);
}


The CSendReceiveDocument definition is:
class CSendReceiveDocument : public CDocument
{
protected:
    DECLARE_DYNCREATE(CSendReceiveDocument)

    CUDPSocket m_UDPSocket;
    int m_DataSize;
    UINT m_rSocketPort;
    CString m_rSocketAddress;
    static const CString m_NoPath;
    CString m_Message, m_ReceivedData;
    CTime m_TimeReceived;

    // ClassWizard generated virtual function overrides
    //{{AFX_VIRTUAL(CSendReceiveDocument)
    public:
    virtual BOOL OnOpenDocument(LPCTSTR lpszPathName);
    virtual void OnCloseDocument();
    virtual BOOL OnNewDocument();
    virtual void DeleteContents();
    virtual void SetPathName(LPCTSTR lpszPathName, BOOL bAddToMRU = TRUE);
    protected:
    virtual BOOL SaveModified();
    //}}AFX_VIRTUAL

public:
    CSendReceiveDocument();
    virtual ~CSendReceiveDocument() {};
    void SendTo(LPCTSTR, DWORD, LPCTSTR);
    void OnReceive(void * const, int, const CString, UINT);
#ifdef _DEBUG
    virtual void AssertValid() const;
    virtual void Dump(CDumpContext& dc) const;
#endif

// Generated message map functions
protected:
    //{{AFX_MSG(CSendReceiveDocument)
    //}}AFX_MSG
    DECLARE_MESSAGE_MAP()
};


The CSendReceiveDocument implementation is:
const CString CSendReceiveDocument::m_NoPath = "None";

CSendReceiveDocument::CSendReceiveDocument() : m_DataSize(0), m_rSocketPort(0) {
    CString Path;
    m_UDPSocket.SetDocument(this);
    CSocketAddressIn SocketAddressIn(INADDR_ANY);
    SocketAddressIn.GetAddress(Path);
    Path += " : 0";
    SetPathName(Path);
}

BOOL CSendReceiveDocument::OnOpenDocument(LPCTSTR lpszPathName)
{
    CString ErrorMessage, Message, PathName(lpszPathName), SocketAddress, s;
    int ColonIndex;
    UINT Port(0);
    long Events;

    OnCloseDocument();
    if (PathName == m_NoPath)
        return TRUE;
    ColonIndex = PathName.Find(':');
    if (ColonIndex == -1)
        SocketAddress = PathName;
    else {
        SocketAddress = PathName.Left(ColonIndex);
        s = PathName.Mid(ColonIndex+1);
        s.TrimLeft();
        Port = strtoul(s, NULL, 10);
    }
    Events = FD_READ | FD_WRITE | FD_CONNECT | FD_CLOSE;
    if (!m_UDPSocket.Create(Port, SOCK_DGRAM, Events, SocketAddress))
    {
        GetErrorMessage(GetLastError(), ErrorMessage);
        Message.Format("The socket for %s was not created: %s",
            PathName, ErrorMessage);
        AfxMessageBox(Message);
        SetPathName(m_NoPath);
        m_Message = "Open failed";
        UpdateAllViews(NULL, 8, NULL);
        return FALSE;
    }
    SetPathName(PathName);
    m_Message = "Opened: ";
    m_Message += PathName;
    UpdateAllViews(NULL, 1, NULL);
    SetModifiedFlag(TRUE);
    return TRUE;
}

void CSendReceiveDocument::OnCloseDocument()
{
    m_UDPSocket.Close();
    // CDocument::OnCloseDocument(); // Don't call; will close view and frame
    DeleteContents();
    SetModifiedFlag(FALSE);
}

BOOL CSendReceiveDocument::OnNewDocument()
{
    AfxMessageBox("Sorry, "New Document" is not available");
    return CDocument::OnNewDocument();
}

void CSendReceiveDocument::DeleteContents()
{
    m_DataSize = 0;
    m_Message.Empty();
    m_ReceivedData.Empty();
    UpdateAllViews(NULL, 9, NULL);
    SetTitle(m_NoPath);
    CDocument::DeleteContents();
}

void CSendReceiveDocument::SetPathName(LPCTSTR lpszPathName, BOOL bAddToMRU)
{
    m_strPathName = lpszPathName;
    ASSERT(!m_strPathName.IsEmpty()); // must be set to something
    m_bEmbedded = FALSE;
    SetTitle(lpszPathName);
}

void CSendReceiveDocument::OnReceive(void *const Buffer, int Size,
        const CString rSocketAddress, UINT rSocketPort)
{
    m_rSocketPort = rSocketPort;
    m_rSocketAddress = rSocketAddress;
    m_DataSize = Size;
    m_TimeReceived = CTime::GetCurrentTime();
    memcpy(m_ReceivedData.GetBuffer(Size), Buffer, Size);
    m_ReceivedData.ReleaseBuffer(Size);
    UpdateAllViews(NULL, 2, NULL);
}

void CSendReceiveDocument::SendTo(LPCTSTR Data, DWORD dwAddress, LPCTSTR Port)
{
    CSocketAddressIn SocketAddress;
    CString ErrorMessage, Message;
    int rv;

    SocketAddress.SetAddress(dwAddress);
    SocketAddress.SetPort((u_short)strtoul(Port, NULL, 10));
    rv = m_UDPSocket.SendTo(Data, strlen(Data), SocketAddress, sizeof SocketAddress, 0);
    if (rv == SOCKET_ERROR)
    {
        GetErrorMessage(GetLastError(), ErrorMessage);
        Message.Format("The data was not sent: %s", ErrorMessage);
        AfxMessageBox(Message);
        m_Message = "Send failed";
    }
    else
        m_Message = "Data sent";

    UpdateAllViews(NULL, 8, NULL);
}

BOOL CSendReceiveDocument::SaveModified()
{
    return TRUE;
}


Tags: C++ Client/Server Datagram SOCK_DGRAM UDP UDP Receive UDP Send Share on Facebook Share on X

◀ PREVIOUS
Using the shell to receive notification of removable media being inserted or removed
▶ NEXT
Creating and Using a CAsyncSocket Object to use CAsyncSocket
  Comments 0
Login for comment
SIMILAR POSTS

Creating and Using a CAsyncSocket Object to use CAsyncSocket (created at Aug 28, 2007)

Using the shell to receive notification of removable media being inserted or removed (created at Aug 28, 2007)

MFC based World Wide Web HTTP Server Source Code (created at Aug 28, 2007)

Fast and Good Keyboard/Mouse Test without the message handler (created at Aug 27, 2007)

Simple CGI Programming in C (created at Aug 27, 2007)

C++ CGI Example working on Apache (created at Aug 27, 2007)

Double Linked List based in C++ (created at Sep 08, 2007)

Binary Search Sample Code (created at Sep 08, 2007)

How to run shell command by MFC ? (created at Sep 09, 2007)

How to search file on certain directory ? (created at Jun 15, 2008)

How to call SetTimer function on MFC CDialog class ? (created at Jul 30, 2008)

How to load HTML resource on MFC ? (updated at Dec 17, 2023)

URL Encode, Decode function for MFC (updated at Dec 20, 2023)

KMP String Matching Algorithm (created at Jul 21, 2010)

OTHER POSTS IN THE SAME CATEGORY

Implementing C#'s foreach loop in Delphi 8 (created at Oct 03, 2007)

How to detect resource leaks in a Form (created at Sep 25, 2007)

The best way to enable and disable buttons, menu items and toolbar buttons (created at Sep 25, 2007)

How to exit from a console application (created at Sep 25, 2007)

How to restrict a program to a single instance (created at Sep 25, 2007)

Compress and decompress strings in C# (created at Sep 25, 2007)

Graphics in C# - Irregular Forms (created at Sep 25, 2007)

Extracting the Country from IP Address (created at Sep 25, 2007)

How to run shell command by MFC ? (created at Sep 09, 2007)

Binary Search Sample Code (created at Sep 08, 2007)

Double Linked List based in C++ (created at Sep 08, 2007)

String Replace Function For C# (created at Aug 28, 2007)

How to print character in C# by ASCII code (created at Aug 28, 2007)

MFC based World Wide Web HTTP Server Source Code (created at Aug 28, 2007)

Creating and Using a CAsyncSocket Object to use CAsyncSocket (created at Aug 28, 2007)

Using the shell to receive notification of removable media being inserted or removed (created at Aug 28, 2007)

Adding Custom Paper Sizes To Named Printers (created at Aug 27, 2007)

Print HTML In C# With Or Without The Web Browser Control And The Print Dialog (created at Aug 27, 2007)

A Customizable Printing Text Class (created at Aug 27, 2007)

Simplified .NET Printing In C# (created at Aug 27, 2007)

How To Print Text In C# (created at Aug 27, 2007)

C Sharp Lists (created at Aug 27, 2007)

Simple Example Of IF/THEN Using C# (created at Aug 27, 2007)

Fast and Good Keyboard/Mouse Test without the message handler (created at Aug 27, 2007)

Simple CGI Programming in C (created at Aug 27, 2007)

C++ CGI Example working on Apache (created at Aug 27, 2007)

Simple C# CGI working on Apache (created at Aug 27, 2007)

How to send binary data through C# CGI app? (created at Aug 27, 2007)

Interacting With TinyPic From C# (created at Aug 26, 2007)

Creating A Watched Folder With Assigned Events (created at Aug 26, 2007)

UPDATES

Creating a Pinterest-Style Card Layout with Bootstrap and Masonry (created at Apr 24, 2024)

Mastering Excel Data Importation in PHP (updated at Apr 24, 2024)

JSON format control in PHP (updated at Apr 24, 2024)

Equal Height Blocks in Bootstrap with JavaScript (created at Apr 22, 2024)

How to convert integer to text string ? (updated at Apr 22, 2024)

Checking similarity between two strings in PHP (updated at Apr 21, 2024)

Create Blob Image in HTML based on the given Text, Width and Height in the Center of the Image without saving file (updated at Apr 21, 2024)

How do I determine the client IP type (IPv4/IPv6) in PHP (updated at Apr 16, 2024)

How do I determine the client IP type in Python - IPv4 or IPv6 (updated at Apr 13, 2024)

Getting Started with PyTorch: A Beginner's Guide to Building Your First Neural Network (updated at Apr 09, 2024)

Predicting Buyer Preferences with PyTorch: A Deep Learning Approach (updated at Apr 09, 2024)

Forecasting the Weather with PyTorch: A Beginner's Guide to Temperature Prediction (created at Apr 09, 2024)

PyTorch example to Forcast Stock Price based on 10 days Dataset (created at Apr 09, 2024)

Mastering Model Persistence: Saving and Loading Trained Machine Learning Models in Python (created at Apr 08, 2024)

Harnessing the Power of Random Forest Algorithm in Python (created at Apr 08, 2024)

Understanding and Implementing K-Nearest Neighbors (KNN) Algorithm in Python (created at Apr 08, 2024)

Forecasting with Linear Regression and KNN Regression in Python (updated at Apr 07, 2024)

What is 302 Found Redirection in HTTP 1.1? (created at Apr 04, 2024)

Mastering Random Forest Regression: A Comprehensive Guide with Python Examples (updated at Apr 01, 2024)

Python Implementation of Linear Regression (updated at Apr 01, 2024)

Mastering Supervised Machine Learning with Python: A Comprehensive Guide (created at Apr 01, 2024)

Mastering AI: A Beginner's Guide to Python Programming and Beyond (created at Apr 01, 2024)

How do I create animated background for Google Meet? (updated at Mar 28, 2024)

Building a Simple DNS Server in Delphi with TTL Support (created at Mar 16, 2024)

How to force cookies, disable php sessid in URL ? (updated at Mar 16, 2024)

Implementing a Versatile DNS Server in PHP: Handling A, AAAA, CNAME, and TXT Records (updated at Mar 16, 2024)

Implementing a Versatile DNS Server in Python: Handling A, AAAA, CNAME, and TXT Records (created at Mar 16, 2024)

Building a Basic DNS Server in PHP/Python: A Beginner's Guide (updated at Mar 15, 2024)

Dynamic DNS Made Easy: Building a Python-Based Solution (created at Mar 15, 2024)

Exploring the Depths of Data Transfer: sendfile vs. kTLS (created at Mar 15, 2024)