代码点击这里下载
服务器端截图:
客户端截图:
基于MFC对话框的MFC UPD客户端以及服务器端程序
1.服务器端
1.1服务器端点击create按钮后,程序读取设置的服务器端端口,默认端口为100,创建服务器端socket,将create的按钮变换成close按钮,并且将服务器端的地址及端口与socket bind.开启读取数据线程.
1.2当服务器读取线程接收到数据时,将保存数据源的ip地址以及端口,将数据以及数据的源在receive edit控件中显示出来,并将数据源在client中显示出来.如果是第一次接收到数据,将使能send按钮.
1.3当点击send时,将读取send edit控件中的内容并且发送.
1.4当关闭对话框时将终止读取线程.
2.客户端
2.1输入服务器端ip以及端口号后reset,即可设置发送数据的目标地址,并且开启读取数据线程读取数据,使能send按钮.
2.2按下send按钮后将读取send edit控件中的数据发送至服务器端.
2.3当接收到数据时,将在receive edit控件中显示接收的数据.
2.4当关闭对话框时,将终止读取数据线程
// UDP_ServerDlg.h : 头文件
//
#pragma once
#include "afxcmn.h"
#include "afxwin.h"
#include <WinSock2.h>
// CUDP_ServerDlg 对话框
class CUDP_ServerDlg : public CDialog
{
// 构造
public:
CUDP_ServerDlg(CWnd* pParent = NULL); // 标准构造函数
// 对话框数据
enum { IDD = IDD_UDP_SERVER_DIALOG };
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
// 实现
protected:
HICON m_hIcon;
// 生成的消息映射函数
virtual BOOL OnInitDialog();
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
DECLARE_MESSAGE_MAP()
public:
afx_msg void OnBnClickedButtonCreateServer();
public:
afx_msg void OnBnClickedButtonCloseServer();
public:
// 端口号控件变量
CEdit m_editPortNO;
public:
// IP地址数组
char m_gcIP;
public:
CString tempStr;
public:
afx_msg void OnClose();
public:
CString m_strTempString;
public:
// 服务器端口号
unsigned short m_nPortNO;
public:
// 服务器端socket
SOCKET m_sockServer;
public:
// 若已经创建服务器则为true,否则为false
bool m_bServerCreated;
public:
struct sockaddr_in m_clientAddr;
public:
// 接收数据的edit控件
CEdit m_editReceive;
public:
// 接收数据控件的控件变量,str
CString m_strReceEdit;
public:
afx_msg void OnBnClickedButtonSend();
public:
// 发送edit控件变量,str
CString m_strSendData;
public:
// 若为true则终止线程
bool m_bTerminateThread;
};
// UDP_ServerDlg.cpp : 实现文件
//
#include "stdafx.h"
#include "UDP_Server.h"
#include "UDP_ServerDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// 用于应用程序“关于”菜单项的 CAboutDlg 对话框
class CAboutDlg : public CDialog
{
public:
CAboutDlg();
// 对话框数据
enum { IDD = IDD_ABOUTBOX };
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
// 实现
protected:
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
END_MESSAGE_MAP()
// CUDP_ServerDlg 对话框
CUDP_ServerDlg::CUDP_ServerDlg(CWnd* pParent /*=NULL*/)
: CDialog(CUDP_ServerDlg::IDD, pParent)
, m_gcIP(0)
, tempStr(_T(""))
, m_strTempString(_T(""))
, m_nPortNO(0)
, m_bServerCreated(false)
, m_strReceEdit(_T(""))
, m_strSendData(_T(""))
, m_bTerminateThread(false)
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CUDP_ServerDl