MFC的UDP编程实现
MFC的UDP编程实现
1、编程原理
UDP是面向非连接的通信协议,比TCP协议简单很多。无论是服务器端还是客户端,其通信过程概括为:
创建套接字(socket)-->绑定(bind)-->发送send(或接收recv)-->关闭套接字(closesocket)
2、特殊地址:
在实际通信网络中,我们几乎不会用到“0.0.0.0"和“127.0.0.1”这样的IP地址。但是在一台计算机上,特别用于某些测试用途时,这类地址就有用武之地了。
(1)环回地址:127.0.0.1,该地址可用于本地计算机测试接收功能,即本地计算机绑定一IP地址(如192.168.1.2)时,可向环回地址发送信息M,则本地计算机可收到“反馈”回来的同样信息M(具有服务端性质)
(2)全零网络地址:0.0.0.0,可作为源地址,表示整个网络,即“任意地址”
3、重要函数
(1)创建套接字函数socket()
函数原型:SOCKET PASCAL FAR socket( int af, int type, int protocol);
返回值说明:成功返回套接字,失败返回INVALID_SOCKET;
创建流套接字(TCP)时,如:m_socket = socket(AF_INET,SOCK_STREAM,0)
创建数据报套接字(UDP),如:m_socket = socket(AF_INET,SOCK_DGRAM,0)
在成功创建套接字之后,需要填充sockaddr_in结构体作为网络函数参数:
struct sockaddr_in
{
shortint sin_family;//地址协议
unsigned short int sin_port;//端口号
struct in_addr sin_addr;//IP地址
unsigned char sin_zero[8];// sockaddr与sockaddr_in两个数据结构保持大小相同而保留的空字节。
}
如在VS2010中,有:
//SOCKADDR_INaddrSock;//SOCKADDR_IN为sockadd_in的宏定义,此变量在头文件中定义
((CIPAddressCtrl*)GetDlgItem(IDC_IPADDRESS2))->GetAddress(sourceIP);//获取控件上IP地址
addrSock.sin_family=AF_INET;
addrSock.sin_port=htons(6000);
addrSock.sin_addr.S_un.S_addr=htonl(sourceIP);//sourceIP表示运行该程序的主机IP
(2)绑定函数bind()
函数原型:int PASCAL FAR bind(SOCKET s, const struct sockaddr FAR *name,int namelen)
返回值说明:绑定成功,返回0值,否则返回-1(SOCKET_ERROR)
如:
int retval;
retval = bind(m_socket,(SOCKADDR*)&addrSock, sizeof(SOCKADDR));//SOCKADDR是sockaddr的宏定义
*(3)创建线程函数CreateThread()
创建线程后,立即开启,调度线程函数:
RECVPARAM *pRecvParam=newRECVPARAM;
pRecvParam->sock=m_socket;
pRecvParam->hwnd=m_hWnd;
HANDLE hThread=CreateThread(NULL,0,RecvProc,(LPVOID)pRecvParam,0,NULL);//RecvProc为线程函数
CloseHandle(hThread);
//线程函数
DWORD WINAPICMyChatDlg::RecvProc(LPVOIDlpParameter)
{
//lpParmeter为创建线程是所提交的函数参数
SOCKETsock=((RECVPARAM*)lpParameter)->sock;
HWNDhwnd=((RECVPARAM*)lpParameter)->hwnd;
deletelpParameter; //释放对象
SOCKADDR_IN addrFrom;
int len=sizeof(SOCKADDR);
char recvBuf[200];
char tempBuf[300];
int retval;
while(TRUE) //创建线程的必要性
{
retval=recvfrom(sock,recvBuf,200,0,(SOCKADDR*)&addrFrom,&len);//获取套接字接收内容
if(SOCKET_ERROR==retval)
break;
sprintf(tempBuf,"%s说: %s",inet_ntoa(addrFrom.sin_addr),recvBuf);
::PostMessage(hwnd,WM_RECVDATA,0,(LPARAM)tempBuf);//提交消息,触发消息响应
}
return 0;
}
分析:
struct RECVPARAM
{
SOCKET sock;
HWND hwnd;
};//在头文件中定义该结构体
线程的创建是通过函数CreateThread来实现的,调用成功返回句柄和一个id。
HANDLE CreateThread(
LPSECURITY_ATTRIBUTES lpThreadAttributes, //线程的安全属性,NULL为缺省值
DWORD dwStackSize, //线程堆栈的大小,0为系统缺省值
LPTHREAD_START_ROUTINE lpStartAddress, //线程函数的起始地址可为线程函数名
LPVOID lpParameter, //传递给线程函数的参数,重要!
DWORD dwCreationFlags, //线程创建后是否立即启动,0表示立即启动
LPDWORD lpThreadId //线程的ID号
);
(4)获取接收信息的recvfrom函数(经socket接收数据):
函数原型:ssize_trecvfrom(int sockfd,void *buf,int len,unsigned int flags, struct sockaddr*from,socket_t *fromlen);
参数含义详见:http://baike.baidu.com/view/1744189.htm
功能描述:该函数接收来自套接字的数据,数据存到缓冲区,并从sockaddr中可读取到相关网络参数(如接收数据的源地址等)
(5)发送函数函数sendto()
函数原型:intPASCAL FAR sendto (
IN SOCKET s,
IN const char FAR *buf,
IN int len,
IN int flags,
IN const structsockaddr FAR *to,
IN int tolen);
如:sendto(m_socket,strSend,strSend.GetLength()+1,0,(SOCKADDR*)&addrTo,sizeof(SOCKADDR));
4、关键点:
(1)UDP实现过程简单,关键是了解每个过程所需要函数及其使用方法
(2)为UDP通信创建线程,是设计更加合理
(3)套接字创建之后很重要的一步是填充sockaddr_in,绑定的成功与否与该结构体具有紧密的关系。
(4)如果是基于人机交互的实现模式,UDP通信之前的工作可以分成几个模块,而这些模块,注意要共用一个套接字(如在类中定义一个SOCKET变量)。如果有默认式的UDP通信模式,可以将UDP通信之前的工作放在一起,即定义一个initial函数,将这些过程全放进去即可。
转载于:https://www.cnblogs.com/jack-jia-moonew/p/4238760.html
MFC的UDP编程实现相关推荐
- MFC socket网络编程(流程示例)
MFC socket网络编程(流程示例) 1.TCP流式套接字的编程步骤 在使用之前须链接库函数:工程->设置->Link->输入ws2_32.lib,OK! 服务器端程序: 1.加 ...
- MFC控件编程之复选框单选框分组框
MFC控件编程之复选框单选框分组框 一丶分组框 分组框 英文叫做 GroubBox 添加了分组框主要就是分组.好看.不重点介绍 二丶单选框 英文: Raido Button 单选框需要注意的事项 1. ...
- [C# 网络编程系列]专题七:UDP编程补充——UDP广播程序的实现
上次因为时间的关系,所以把上一个专题遗留下的一个问题在本专题中和大家分享下,本专题主要介绍下如何实现UDP广播的程序,下面就直接介绍实现过程和代码以及运行的结果. 一.程序实现 UDP广播程序的实现代 ...
- [C# 网络编程系列]专题六:UDP编程
引言: 前一个专题简单介绍了TCP编程的一些知识,UDP与TCP地位相当的另一个传输层协议,它也是当下流行的很多主流网络应用(例如QQ.MSN和Skype等一些即时通信软件传输层都是应用UDP协议的) ...
- Java刷题知识点之TCP、UDP、TCP和UDP的区别、socket、TCP编程的客户端一般步骤、TCP编程的服务器端一般步骤、UDP编程的客户端一般步骤、UDP编程的服务器端一般步骤...
TCP和UDP是两个传输层协议,广泛应用于网络中不同主机之间传输数据.对任何程序员来说,熟悉TCP和UDP的工作方式都是至关重要的.这就是为什么TCP和UDP是一个流行的Java编程面试问题. Jav ...
- 穿透Socks5 代理的UDP编程
网络编程中,对于数据传输实时性要求较高的场合,大家都会选择UDP来作为数据传输协议,在TCP/IP协议族中UDP协议较TCP协议需要的网络系统资源更少.然而在企业应用中,由于网络安全原因等会导致除了特 ...
- TCP/UDP编程中的问题汇总
TCP/UDP编程中的问题汇总 TCP和UDP发送大文件的问题. 答: 发送端: 发送时,先发送文件的名称及大小等信息. 然后,设置一个缓冲区的大小,假设为4K. 再循环读4K的文件内容,并发送,直到 ...
- Java UDP 编程简介.
一.UDP 协议简介 UPD协议 是常见的 网络传输协议之一, 当然另1个是TCP协议. UPD协议 是一种不靠的协议. 是因为发送方不会关心接受方的状态, 直接向接收方发送数据包, 也就是说这个数据 ...
- Qt学习笔记之UDP编程
1. UDP概述 UDP 是User Datagram Protocol的简称, 中文名是用户数据报协议,是OSI(Open System Interconnection,开放式系统互联) 参考模型中 ...
最新文章
- matlab sperman相关,相关系数
- usb网络linux系统安装教程,Linux系统入门学习:如何在树莓派上安装USB网络摄像头...
- 【线性表4】线性表的链式实现:静态表
- Eclipse Java注释模板设置
- manjaro文件不是一个有效的图表主题_重磅分享-揭开Excel动态交互式图表神秘面纱...
- Tomcat启用HTTPS协议配置过程
- 信息学奥赛一本通——1000:入门测试题目
- C#中判断字符串相等的方法
- 比较LANG和NLS_LANG在Linux中的作用
- 初探JavaScript PDF blob转换为Word docx方法
- 策略盈亏分布统计——从零到实盘11
- Coloring Tree
- UVA 10559 Blocks 方块消除
- FPGA 视频处理中外部SDRAM的作用
- Excel如何永久去除“受保护视图”的打开提醒?
- 冗余系统研究:智能汽车的最后安全防线
- WebRTC的拥塞控制技术(Congestion Control
- 经济危机===丐帮也裁员!!!(各企业裁员统计)
- 工作好搭档(四):铷安居 H-C81 电脑桌
- 【HUI】AccordionMenu 手风琴菜单(基于jQuery)
热门文章
- DataReader类访问字段的值
- pda连接电脑无法存取文件_手机无法连接电脑怎办
- java基础输入_java基础之标准输入
- 最小栈设计并实现一个minstack类_栈相关
- devc++鼠标变成了光标_游戏鼠标选购避坑指南 教你如何轻松选择适合自己的鼠标...
- Netty空闲心跳检测机制
- 多个折线样式_新技能get,折线图转化成多阶梯瀑布图
- java+测试ip是否通_java 批量测试主机能否ping通
- java中常见的包类接口_Java中一些常用的类,包,接口
- java flink使用addSink方法保存流数据到redis