对于许多初学者来说,网络通信程序的开发,普遍的一个现象就是觉得难以入手。许多概念,诸如:同步(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

入门基础-VC网络编程入门相关推荐

  1. python的基础网络编程是下列_Python入门基础之网络编程、socket编程、TCP、UDP编程...

    忙了两天,继续更文!希望多多支持. 套接字 套接字是一种具有之前所说的"通讯端点"概念的计算机网络数据结构.网络化的应用程序在开始任何通讯之前都必需要创建套接字. 套接字有三种: ...

  2. 【Python入门基础】网络编程

    文章目录 TCP/IP模型 网络应用模式 基于HTTP协议的网络资源访问 HTTP(超文本传输协议) JSON requests库 基于传输层协议的套接字编程 TCP套接字 UDP套接字 网络应用开发 ...

  3. 脑残式网络编程入门(三):HTTP协议必知必会的一些知识

    为什么80%的码农都做不了架构师?>>>    本文原作者:"竹千代",原文由"玉刚说"写作平台提供写作赞助,原文版权归"玉刚说&q ...

  4. 【带你入门】java网络编程

    网络编程 网络编程对于很多的初学者来说,都是很向往的一种编程技能,但是很多的初学者却因为很长一段时间无法进入网络编程的大门而放弃了对于该部分技术的学习. 在 学习网络编程以前,很多初学者可能觉得网络编 ...

  5. 脑残式网络编程入门(一):跟着动画来学TCP三次握手和四次挥手

    转自即时通讯网:http://www.52im.net/ 1.引言 网络编程中TCP协议的三次握手和四次挥手的问题,在面试中是最为常见的知识点之一.很多读者都知道"三次"和&quo ...

  6. python编程入门与案例详解-Pythony运维入门之Socket网络编程详解

    Socket是什么? Socket 是电脑网络中进程间数据流的端点Socket 是操作系统的通信机制应用程序通过Socket进行网络数据的传输 首先,简单了解一下TCP通信过程: TCP三次握手(面试 ...

  7. Android网络编程入门解析

    网络编程 网络编程对于很多的初学者来说,都是很向往的一种编程技能,但是很多的初学者却因为很长一段时间无法进入网络编程的大门而放弃了对于该部分技术的学习. 在 学习网络编程以前,很多初学者可能觉得网络编 ...

  8. Day14.网络编程入门及其应用

    网络编程入门及其应用 文章目录 网络编程入门及其应用 前言 一. 网络编程的入门 1.1 计算机网络基础 1.2 计算机网络发展史 1.3 TCP/IP模型 1.4 网络应用模式 二. 基于HTTP协 ...

  9. Day14:网络编程入门

    网络编程入门 计算机网络基础 计算机网络是独立自主的计算机互联而成的系统的总称,组建计算机网络最主要的目的是实现多台计算机之间的通信和资源共享.今天计算机网络中的设备和计算机网络的用户已经多得不可计数 ...

最新文章

  1. springboot 请求路径有后缀_springboot指定访问url接口后缀:*.do或*.action
  2. js实现下拉框三级级联
  3. Centos6.5环境中安装vsftp服务
  4. mysql ERROR 1045 (28000): 错误解决办法
  5. 《WinForm开发系列之控件篇》Item3 BindingSource (暂无)
  6. 一定要陪一个男人创业,你会和他一样快速成长,并内心变得强大
  7. 学了这么多年的人工智能居然还不了解它?
  8. Android背景图片设置
  9. oracle导出要工具,Oracle导出工具的具体操作步骤详解
  10. adobe 不适应 Max to分屏软件的修改
  11. 绩效考核如何尽量公正
  12. 数据库的部分依赖、完全依赖、传递依赖
  13. Matlab中inv函数的使用
  14. 为什么只看重结果_太过于看重结果会失掉过程
  15. mac M1+python+appium环境搭建
  16. 【mysql or条件是否走索引】
  17. 堆栈计算机的原理和实现
  18. 【Axure高保真原型】移动端钱包原型模板
  19. 漫步者蓝牙自动断开_漫步者Lolli Pods:销量惊人的宝藏真无线耳机
  20. linux进程流量检测,linux使用shell检测并记录网卡流量

热门文章

  1. Nginx 服务器开启status页面检测服务状态
  2. php数组操作集锦- 掌握了数组操作, 也就掌握了php
  3. 用状态机STATE MACHINE实现有选择的文件转换
  4. RHCE课程-初级部分6、编辑工具VIM,网络配置,进程优先,日志文件简介。
  5. 微信小程序研发问题梳理:翻页:下拉:缓存:canvas:富文本:分享
  6. 如何使用Nikto漏洞扫描工具检测网站安全
  7. 小米oj 反向位整数(简单位运算)
  8. Oracle服务器修改IP后
  9. J - 青蛙的约会(扩展欧几里得)
  10. 30分钟掌握 C#7