基于VC/MFC 的UDP广播,我怎么接受返回的数据包
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于VC/MFC 的UDP广播,我怎么接受返回的数据包相关的知识,希望对你有一定的参考价值。
创建UDP的socket server,端口就是返回的数据包使用的端口,然后在server的接收函数里面获取,删选;或者也可以直接起个原始套接字的server,接收所有的套接字流,然后根据你的返回数据包的端口慢慢删选; 参考技术A 基于VC/MFC 的UDP广播有我在,没问题.
基于VC的MFC界面开发
UpdateData(TRUE);//将输入数据赋给文本框变量。
UpdateData(FALSE);//将内容显示在文本框中
AfxMessageBox("演示弹窗");
当使用弹窗的时候会阻塞进程。
进阶(未实现):VC++6.0可视化窗口怎么填加图片
本例是基于C语言实现的Windows socket的编程。
注意,在新建时不要勾选“Windows Socket”,因为用到了<winsock2.h>,勾选后会报错,说有一个结构体被定义了两次:
(这前面是你的VC安装路径)includewinsock2.h(99) : error C2011: 'fd_set' : 'struct' type redefinition
参考代码如下:
// 333Dlg.cpp : implementation file
//客户端
#include "stdafx.h"
#include "333.h"
#include "333Dlg.h"
#include <stdlib.h>
#include<Winsock2.h>
#pragma comment (lib,"ws2_32.lib")
#define BUFFER_SIZE 1024
#define MY_PORT 3434
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CMy333Dlg dialog
CMy333Dlg::CMy333Dlg(CWnd* pParent /*=NULL*/)
: CDialog(CMy333Dlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CMy333Dlg)
m = _T("");
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CMy333Dlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CMy333Dlg)
DDX_Text(pDX, IDC_EDIT1, m);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CMy333Dlg, CDialog)
//{{AFX_MSG_MAP(CMy333Dlg)
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_BUTTON1, OnButton1)
ON_EN_CHANGE(IDC_EDIT1, OnChangeEdit1)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CMy333Dlg message handlers
BOOL CMy333Dlg::OnInitDialog()
{
CDialog::OnInitDialog();
// 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
// TODO: Add extra initialization here
return TRUE; // return TRUE unless you set the focus to a control
}
// If you add a minimize button to your dialog, you will need the code below
// to draw the icon. For MFC applications using the document/view model,
// this is automatically done for you by the framework.
void CMy333Dlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting
SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
}
// The system calls this to obtain the cursor to display while the user drags
// the minimized window.
HCURSOR CMy333Dlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}
void CMy333Dlg::OnButton1()
{
// TODO: Add your control notification handler code here
// TODO: Add your control notification handler code here
SOCKET conn_sock;
struct sockaddr_in client_addr;
//WSA初始化
WSADATA wsadata;
WSAStartup(MAKEWORD(1,1),&wsadata);
//配置connect
conn_sock = socket(AF_INET,SOCK_STREAM,0);
bind(conn_sock,(struct sockaddr*)&client_addr,sizeof(struct sockaddr));
//配置server addr
client_addr.sin_family = AF_INET;
client_addr.sin_port = htons(MY_PORT);
client_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
//链接
connect(conn_sock,(struct sockaddr *)&client_addr,sizeof(struct sockaddr));
//接收
char rc[100] = "";
recv(conn_sock,rc,sizeof(rc),0);
//printf("From Server : %s
",rc);
AfxMessageBox("连接成功!");
//输入路径
//printf("Please input path:
");
//char path[100];
//scanf("%s",&path);
//发送路径
//send(conn_sock,path,strlen(path),0);
//打开文件,准备写入
FILE * fp = fopen(m, "rt");
if(NULL == fp)
{
//printf("File: %s Can Not Open To Write
", path);
AfxMessageBox("打开文件失败!");
system("pause");
exit(1);
}
else
{
char buffer[BUFFER_SIZE];
memset(buffer, 0, BUFFER_SIZE);
int length = 0;
//发送文件内容,直到读不到文件
while((length = fread(buffer, sizeof(char), BUFFER_SIZE, fp)) > 0)
{
if (send(conn_sock, buffer, length, 0) < 0)//向服务端发送
{
//printf("Send File: %s Failed
", path);
AfxMessageBox("发送失败!");
break;
}
memset(buffer, 0, BUFFER_SIZE);
}
//printf("File: %s Transfer Successful!
", path);
AfxMessageBox("发送成功!");
}
fclose(fp); //关闭文件
closesocket(conn_sock);
WSACleanup();
}
void CMy333Dlg::OnChangeEdit1()
{
// TODO: If this is a RICHEDIT control, the control will not
// send this notification unless you override the CDialog::OnInitDialog()
// function and call CRichEditCtrl().SetEventMask()
// with the ENM_CHANGE flag ORed into the mask.
// TODO: Add your control notification handler code here
UpdateData(TRUE);//将输入数据赋给文本框变量。
UpdateData(FALSE);//将内容显示在文本框中
}
// 111Dlg.cpp : implementation file
//服务器端
#include "stdafx.h"
#include "111.h"
#include "111Dlg.h"
#include <Winsock2.h>
#pragma comment (lib,"ws2_32.lib")
#define BUFFER_SIZE 1024
#define MY_PORT 3434
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CMy111Dlg dialog
CMy111Dlg::CMy111Dlg(CWnd* pParent /*=NULL*/)
: CDialog(CMy111Dlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CMy111Dlg)
m = _T("");
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CMy111Dlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CMy111Dlg)
DDX_Text(pDX, IDC_EDIT1, m);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CMy111Dlg, CDialog)
//{{AFX_MSG_MAP(CMy111Dlg)
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_BUTTON1, OnStart)
ON_EN_CHANGE(IDC_EDIT1, OnChangeEdit1)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CMy111Dlg message handlers
BOOL CMy111Dlg::OnInitDialog()
{
CDialog::OnInitDialog();
// 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
// TODO: Add extra initialization here
return TRUE; // return TRUE unless you set the focus to a control
}
// If you add a minimize button to your dialog, you will need the code below
// to draw the icon. For MFC applications using the document/view model,
// this is automatically done for you by the framework.
void CMy111Dlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting
SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
}
// The system calls this to obtain the cursor to display while the user drags
// the minimized window.
HCURSOR CMy111Dlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}
void CMy111Dlg::OnStart()
{
// TODO: Add your control notification handler code here
//WSA初始化
WSADATA wsadata;
char *buffer = "Welcome ! Server connected.";//字符串
struct sockaddr_in server_addr;
SOCKET listen_socket;
WSAStartup(MAKEWORD(1,1),&wsadata);
//配置server addr
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(MY_PORT);
server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
//配置listener
listen_socket = socket(AF_INET,SOCK_STREAM,0);
bind(listen_socket,(struct sockaddr*)&server_addr,sizeof(struct sockaddr));
int flag = 1;
while (flag)
{
//开始监听
listen(listen_socket,5);
int dummy = sizeof(SOCKADDR);
//printf("Listening to client...
");
AfxMessageBox("等待客户端连接......");
//建立连接
SOCKET new_socket = accept(listen_socket,NULL,&dummy);
//printf("Client connected!
");
AfxMessageBox("连接成功!准备从客户端接收文件......");
//发送信息
send(new_socket,buffer,strlen(buffer),0);
char rc[100] = "";
//recv(new_socket,rc,sizeof(rc),0);
//printf("File name from Client : %s
",rc);
//char path[100];
char buf[999];
//printf("Please set a path to save file:
");
FILE * fp = fopen(m, "wt");//以写入的方式打开文件
if (NULL == fp)
{
//printf("File: %s Not Found
", path);
AfxMessageBox("写入文件失败!");
}
else
{
memset(buf, 0, BUFFER_SIZE);
unsigned int length = 0;
//接受到客户端发来的文件数据
while ((length = recv(new_socket, buf, BUFFER_SIZE, 0)) > 0)
{
//把发来的数据写入到文件中
if (fwrite(buf, sizeof(char), length, fp) < length)
{
//printf("File: %s Write Failed
", path);
AfxMessageBox("接收失败!");
break;
}
memset(buf, 0, BUFFER_SIZE);
}
//printf("Receive File: %s From Server Successful!
", path);
AfxMessageBox("接收成功!");
flag = 0;
}
fclose(fp); //关闭文件
closesocket(new_socket);
}
closesocket(listen_socket);
WSACleanup();
}
void CMy111Dlg::OnChangeEdit1()
{
// TODO: If this is a RICHEDIT control, the control will not
// send this notification unless you override the CDialog::OnInitDialog()
// function and call CRichEditCtrl().SetEventMask()
// with the ENM_CHANGE flag ORed into the mask.
// TODO: Add your control notification handler code here
UpdateData(TRUE);//将输入数据赋给文本框变量。
UpdateData(FALSE);//将内容显示在文本框中
}
以上是关于基于VC/MFC 的UDP广播,我怎么接受返回的数据包的主要内容,如果未能解决你的问题,请参考以下文章
CGridCtrl 一行文字太长时候,怎么让 CGridCtrl 能够换行显示? VC/MFC / ...