入门基础-VC网络编程入门

对于许多初学者来说,网络通信程序的开发,普遍的一个现象就是觉得难以入手。许多概念,诸如:同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)等,初学者往往迷惑不清,只知其所以而不知起所以然。

同步方式指的是发送方不等接收方响应,便接着发下个数据包的通信方式;而异步指发送方发出数据后,等收到接收方发回的响应,才发下一个数据包的通信方式。

阻塞套接字是指执行此套接字的网络调用时,直到成功才返回,否则一直阻塞在此网络调用上,比如调用recv()函数读取网络缓冲区中的数据,如果没有数据到达,将一直挂在recv()这个函数调用上,直到读到一些数据,此函数调用才返回;而非阻塞套接字是指执行此套接字的网络调用时,不管是否执行成功,都立即返回。比如调用recv()函数读取网络缓冲区中数据,不管是否读到数据都立即返回,而不会一直挂在此函数调用上。在实际Windows网络通信软件开发中,异步非阻塞套接字是用的最多的。平常所说的C/S(客户端/服务器)结构的软件就是异步非阻塞模式的。

对于这些概念,初学者的理解也许只能似是而非,我将用一个最简单的例子说明异步非阻塞Socket的基本原理和工作机制。目的是让初学者不仅对Socket异步非阻塞的概念有个非常透彻的理解,而且也给他们提供一个用Socket开发网络通信应用程序的快速入门方法。操作系统是Windows 98(或NT4.0),开发工具是Visual C++6.0。

MFC提供了一个异步类CAsyncSocket,它封装了异步、非阻塞Socket的基本功能,用它做常用的网络通信软件很方便。但它屏蔽了Socket的异步、非阻塞等概念,开发人员无需了解异步、非阻塞Socket的原理和工作机制。因此,建议初学者学习编网络通信程序时,暂且不要用MFC提供的类,而先用Winsock2 API,这样有助于对异步、非阻塞Socket编程机制的理解。

为了简单起见,服务器端和客户端的应用程序均是基于MFC的标准对话框,网络通信部分基于Winsock2 API实现。

先做服务器端应用程序。

用MFC向导做一个基于对话框的应用程序SocketSever,注意第三步中不要选上Windwos Sockets选项。在做好工程后,创建一个SeverSock,将它设置为异步非阻塞模式,并为它注册各种网络异步事件,然后与自定义的网络异步事件联系上,最后还要将它设置为监听模式。在自定义的网络异步事件的回调函数中,你可以得到各种网络异步事件,根据它们的类型,做不同的处理。下面将详细介绍如何编写相关代码。

在SocketSeverDlg.h文件的类定义之前增加如下定义:

#define NETWORK_EVENT WM_USER+166 file://定义网络事件

SOCKET ServerSock; file://服务器端Socket

在类定义中增加如下定义:

class CSocketSeverDlg : CDialog

{

public:

SOCKET ClientSock[CLNT_MAX_NUM]; file://存储与客户端通信的Socket的数组

/*各种网络异步事件的处理函数*/

void OnClose(SOCKET CurSock); file://对端Socket断开

void OnSend(SOCKET CurSock); file://发送网络数据包

void OnReceive(SOCKET CurSock); file://网络数据包到达

void OnAccept(SOCKET CurSock); file://客户端连接请求

BOOL InitNetwork(); file://初始化网络函数

void OnNetEvent(WPARAM wParam, LPARAM lParam); file://异步事件回调函数

};

在SocketSeverDlg.cpp文件中增加消息映射,其中OnNetEvent是异步事件回调函数名:

ON_MESSAGE(NETWORK_EVENT,OnNetEvent)

定义初始化网络函数,在SocketSeverDlg.cpp文件的OnInitDialog()中调此函数即可。

BOOL CSocketSeverDlg::InitNetwork()

{

WSADATA wsaData;

file://初始化TCP协议

BOOL ret = WSAStartup(MAKEWORD(2,2), &wsaData);

if(ret != 0)

{

MessageBox("初始化网络协议失败!");

return FALSE;

}

file://创建服务器端套接字

ServerSock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

if(ServerSock == INVALID_SOCKET)

{

MessageBox("创建套接字失败!");

closesocket(ServerSock);

WSACleanup();

return FALSE;

}

file://绑定到本地一个端口上

sockaddr_in localaddr;

localaddr.sin_family = AF_INET;

localaddr.sin_port = htons(8888); file://端口号不要与其他应用程序冲突

localaddr.sin_addr.s_addr = 0;

if(bind(ServerSock ,(struct sockaddr*)&localaddr,sizeof(sockaddr))

= = SOCKET_ERROR)

{

MessageBox("绑定地址失败!");

closesocket(ServerSock);

WSACleanup();

return FALSE;

}

转载于:https://www.cnblogs.com/tianlangshu/archive/2011/03/20/1989430.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/303719.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

NET问答: 如何按属性进行 Distinct() ?

咨询区 Patrick Desjardins&#xff1a;我现在正在学习 LINQ&#xff0c;对一个简单类型的 List 进行 Distinct() 是非常简单的&#xff0c;如 List<int> 或 List<string>&#xff0c;但如果对复杂类型 List<T> 的某一个或者多个属性进行 Distinct() 的话&am…

html站点如何命名,html页面的CSS、DIV命名规则

68. XHTML文件中id的命名(1)页面结构容器: container页头&#xff1a;header内容&#xff1a;content/container页面主体&#xff1a;main页尾&#xff1a;footer导航&#xff1a;nav侧栏&#xff1a;sidebar栏目&#xff1a;column页面外围控制整体布局宽度&#xff1a;wra…

2020邮箱账号密码大全_通知 | 复旦大学2020年春季学期研究生选课FAQ

1选课须知1. 研究生选课系统什么时间开放&#xff1f; 答&#xff1a;2020年春季学期研究生选课系统开放时间为&#xff1a;2020年2月19日(周三)10:00至2020年3月9日(周一)10:00。2020年3月9日(周一)10:00后&#xff0c;研究生可以在选课系统中查询课表、已选课程、学分获得情况…

如何从零开始构建深度学习项目?这里有一份详细的教程

导读&#xff1a;在学习了有关深度学习的理论之后&#xff0c;很多人都会有兴趣尝试构建一个属于自己的项目。本文将会从第一步开始&#xff0c;告诉你如何解决项目开发中会遇到的各类问题。本文由六大部分组成&#xff0c;涵盖深度学习 ( DL ) 项目的整个过程。我们将使用一个…

性能分布式NewLife.XCode对无限数据的支持

上周发布了《改进版CodeTimer及XCode性能测试》&#xff0c;展示了NewLife.XCode在性能上的表现。实际上NewLife.XCode是一个很平凡的ORM&#xff0c;只是在分页和缓存方面多下点功夫&#xff0c;注意每一个细节&#xff0c;才能保证在数据量大、业务繁忙的环境中得以保持良好的…

C#实用小知识:string和判断null

stringstring是常用的类型&#xff0c;它具有不可变性&#xff1a;就是一旦赋值&#xff0c;就不可变&#xff0c;如果再赋值 &#xff0c;就重新开辟内存空间&#xff1b;保留性&#xff1a;如果一个字符串存在&#xff0c;另一个与其相同&#xff0c;他们会指向同一个地址&am…

s6730堆叠_不再只是堆叠硬件 ivvi S6全方位评测

【PConline 评测】ivvi是酷派公司的又一个全新的子品牌&#xff0c;与旗下的电商品牌“大神”相比&#xff0c;ivvi的定位更为高端&#xff0c;动用酷派公司的顶级资源打造&#xff0c;通过线上线下一体销售。在机身做工设计与硬件选用方面ivvi尽善尽美&#xff0c;集合了酷派手…

.net html5页面缓存,详解HTML5中的manifest缓存使用

起源html5之前的网页&#xff0c;都是无连接&#xff0c;必须联网才能访问&#xff0c;这其实也是web的特色&#xff0c;这其实对于PC是时代问题并不大&#xff0c;但到了移动互联网时代&#xff0c;设备终端位置不再固定&#xff0c;依赖无线信号&#xff0c;网络的可靠性变得…

机器学习的最佳学习路线原来只有四步

AI这个词相信大家都非常熟悉&#xff0c;近几年来人工智能圈子格外热闹&#xff0c;光是AlphoGo就让大家对它刮目相看。今天小天就来跟大家唠一唠如何进军人工智能的第一步——机器学习。在机器学习领域&#xff0c;Python已经成为了主流。一方面因为这门语言简单易上手&#x…

AutoCAD VBA基于对象的分层

AutoCAD VBA基于对象的分层&#xff0c;讲不同对象根据特性分层&#xff0c;代码如下。 Dim Value As Variant Value ThisDrawing.GetVariable("cmdecho") ThisDrawing.SetVariable "cmdecho", 0 Dim ObjLayer As AcadLayer Set ObjLayer ThisDrawing.La…

ASP.NET Core Filter如何支持依赖注入

概述通过使用 ASP.NET Core 中的筛选器&#xff0c;可在请求处理管道中的特定阶段之前或之后运行代码。内置筛选器处理任务&#xff0c;例如&#xff1a;授权&#xff08;防止用户访问未获授权的资源&#xff09;。响应缓存&#xff08;对请求管道进行短路出路&#xff0c;以便…

做流向图_各类型供热暖系统图大全,一饱眼福!

↑ 点击上方“暖通风向标”关注我们推广.暖通风向标本文来源&#xff1a;制冷网好书推荐做热泵这几本书你不得不看&#xff01;区域供热系统热电联产系统地热水供暖系统即热式生活热水系统即热式特点:可保证用户随时随地均有热水供应&#xff0c;系统紧凑&#xff0c;无需储罐&…

怎样和程序猿谈一场不散场的爱情

这篇文章就教你如何优&#xff08;xin&#xff09;雅&#xff08;ji&#xff09;的驯服程序猿男友。先分享2个网友的养猿故事。对于程序员&#xff0c;大家想必会有这么一个印象&#xff1a;生活简单乏味&#xff0c;除了编程、吃饭、睡觉&#xff0c;就是上网、打游戏或者一副…

ITU-R BT.656 协议

ITU-R BT.601和ITU-R BT.656国际电信联盟&#xff08;International Telecommunication Union&#xff09;无线通信部门&#xff08;ITU-R&#xff09;制定的标准。严格来说&#xff0c;ITU-R BT.656应该是隶属ITU-R BT.601的一个子协议。ITU-R BT.601是演播室数字电视编码参数…

html下拉菜单的子目录,html - 带有下拉菜单的子菜单的垂直下拉菜单 - 堆栈内存溢出...

我想用以下结构制作一个垂直下拉菜单(对于每个“按钮”一个不同的“下拉” div)。这个想法是当我将“按钮”悬停时&#xff0c;“下拉”以相同的方式出现在“按钮”上大小 (“下拉列表”缩小为高度“ subnav1”相等的“按钮”大小)或显示在“下拉列表”的左侧 (再次具有“ subn…

一年增加1.2w星,Dapr能否引领云原生中间件的未来?

作者 | 敖小剑Dapr 将引领云原生时代应用和中间件的未来。Dapr 是由微软发起的云原生开源新项目&#xff0c;在今年 2 月份刚刚发布了 v1.0 正式版本。虽然推出至今不过一年半时间&#xff0c;但 Dapr 发展势头十分迅猛&#xff0c;目前已经在 GitHub 上收获了 1.2w 星。阿里是…

kylin如何支持flink_日均万亿条数据如何处理?爱奇艺实时计算平台这样做

1.爱奇艺 Flink 服务现状爱奇艺从 2012 年开始开展大数据业务&#xff0c;一开始只有二十几个节点&#xff0c;主要是 MapReduce、Hive 等离线计算任务。到 2014 年左右上线了 Storm、Spark 实时计算服务&#xff0c;并随后发布了基于 Spark 的实时计算平台 Europa。2017 年开始…

VI3的VLAN配置:VST、EST和VGT标记

VMware专家谈及在VMware Infrastructure(VI3)中使用虚拟LAN&#xff08;VLAN&#xff09;时&#xff0c;他们通常是指VLAN Trunk的使用。不过&#xff0c;VI3使用的VLAN配置还有其他三种类型&#xff1a;Virtual Switch Tagging&#xff08;虚拟交换机标记&#xff0c;缩写VST …

没错,纯SQL查询语句可以实现神经网络

我们熟知的SQL是一种数据库查询语句&#xff0c;它方便了开发者在大型数据中执行高效的操作。但本文从另一角度嵌套SQL查询语句而构建了一个简单的三层全连接网络&#xff0c;虽然由于语句的嵌套过深而不能高效计算&#xff0c;但仍然是一个非常有意思的实验。在这篇文章中&…

html5 控制鼠标移动,HTML5 Canvas随鼠标移动的引力粒子群

JavaScript语言&#xff1a;JaveScriptBabelCoffeeScript确定use strict;// Initial Setupvar canvas document.querySelector(canvas);var c canvas.getContext(2d);canvas.width innerWidth;canvas.height innerHeight;// Variablesvar mouse {x: innerWidth / 2,y: inn…