Click here to Skip to main content
15,888,803 members
Articles / Desktop Programming / MFC

Simple client-server UDP socket program

Rate me:
Please Sign up or sign in to vote.
3.90/5 (8 votes)
5 Jun 2008GPL3 92.4K   9K   25   12
A simple MFC application for sending and receiving UDP datagrams.

Image 1

Introduction

This is a simple application demonstrating a UDP client server in MFC. There are many examples related to TCP, but very few for UDP. So, I thought of making a simple application and uploading it here.

Background

The main dialog acts as a server. The server will keep on waiting for data on a particular port, it receives the data and then displays it. The client is started on clicking a Start button of the main dialog. It can send data to the server. The server then receives the data and displays it.

Using the code

The main dialog class, CSimpleUDPDlg, acts as a server. A thread is started in OnInitDialog() of the main dialog to receive the data sent by the client.

Code snippets of CSimpleUDPDlg.cpp and CClientSend.cpp are shown below:

C++
#include "afxsock.h" 
//Add global variables 
HANDLE thr;
unsigned long id1; 
// Definition of Thread ReceiveData shown below. 
UINT ReceiveData(LPVOID pParam)
{
    CSimpleUDPDlg *dlg=(CSimpleUDPDlg*)pParam;
    AfxSocketInit(NULL);
    CSocket echoServer;  

     // Create socket for sending/receiving datagrams
     if (echoServer.Create(514, SOCK_DGRAM, NULL)== 0) {
        AfxMessageBox("Create() failed");
     }

    for(;;) { // Run forever

    // Client address
    SOCKADDR_IN echoClntAddr; 

    // Set the size of the in-out parameter
    int clntAddrLen = sizeof(echoClntAddr);

    // Buffer for echo string
    char echoBuffer[ECHOMAX]; 
 
    // Block until receive message from a client
    int recvMsgSize = echoServer.ReceiveFrom(echoBuffer, 
      ECHOMAX, (SOCKADDR*)&echoClntAddr, &clntAddrLen, 0);
    if (recvMsgSize < 0) {
      AfxMessageBox("RecvFrom() failed");
    }
    
    echoBuffer[recvMsgSize]='\0';
    
    dlg->m_edit.ReplaceSel(echoBuffer);
    dlg->m_edit.ReplaceSel("\r\n");
}

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

    // Add "About..." menu item to system menu.

    // IDM_ABOUTBOX must be in the system command range.
    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);
        }
    }

    // Set the icon for this dialog. The framework does this automatically
    //  when the application's main window is not a dialog
    SetIcon(m_hIcon, TRUE);            // Set big icon
    SetIcon(m_hIcon, FALSE);        // Set small icon

    //start a thread to receive data send by client 
    thr=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ReceiveData,this,NULL,&id1);
    // TODO: Add extra initialization here
    
    return TRUE;  // return TRUE  unless you set the focus to a control
}

//The client dialog is started in OnStart() function  
void CSimpleUDPDlg::OnStart() 
{
    // TODO: Add your control notification handler code here
    CClientSend send;
    send.DoModal();
}

//Code Snippet of CClientSend.cpp is shown below which is a simple dialog class. 
#include "afxsock.h" 

void CClientSend::OnSend() 
{
    // TODO: Add your control notification handler code here
    AfxSocketInit( NULL);
    CString Buffer;
    m_editsend.GetWindowText(Buffer);
    int buflen=strlen(Buffer);

    CSocket echoClient;  

    if (echoClient.Create(0,SOCK_DGRAM,NULL) == 0) {
         AfxMessageBox("Create() failed");
    }
    // in place of localhost we can give IP Address of the Particular machine.
    if (echoClient.SendTo(Buffer, buflen,514,
      (LPCSTR)"localhost", 0) != buflen) {
        AfxMessageBox("SendTo() sent a different number of bytes than expected");
    }

    echoClient.Close();
}

Well, this is my first article, and I hope it would be helpful.

License

This article, along with any associated source code and files, is licensed under The GNU General Public License (GPLv3)


Written By
Software Developer
India India
I am a software developer working with Visual C++.

Comments and Discussions

 
QuestionOne Small Thing - Files In Download Pin
Rick York31-May-17 5:24
mveRick York31-May-17 5:24 
Questiontype LPCTSTR in ReplaceSel doesn't like char Pin
Member 127126822-Sep-16 1:29
Member 127126822-Sep-16 1:29 
QuestionSimple client-server UDP socket program Pin
gunnerForLife17-Oct-12 6:12
gunnerForLife17-Oct-12 6:12 
GeneralMy vote of 4 Pin
slzaleski23-Sep-10 9:31
slzaleski23-Sep-10 9:31 
GeneralGood One Pin
Nyachhyon1234522-Apr-09 2:34
Nyachhyon1234522-Apr-09 2:34 
Thanks for this simple and good article. It helped.
GeneralCode Pin
Xeifrank12-Jun-08 11:58
Xeifrank12-Jun-08 11:58 
AnswerRe: Code Pin
buntyrolln12-Jun-08 18:52
buntyrolln12-Jun-08 18:52 
GeneralRe: Code Pin
Xeifrank16-Jun-08 7:33
Xeifrank16-Jun-08 7:33 
AnswerRe: Code Pin
buntyrolln16-Jun-08 18:01
buntyrolln16-Jun-08 18:01 
GeneralRe: Code Pin
Madhu_Rani23-Jul-09 23:05
Madhu_Rani23-Jul-09 23:05 
Question.aspx wtf? Pin
leppie6-Jun-08 2:25
leppie6-Jun-08 2:25 
AnswerRe: .aspx wtf? Pin
buntyrolln6-Jun-08 3:21
buntyrolln6-Jun-08 3:21 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.