使用VC++的网络编程总结

上传人:我*** 文档编号:133164919 上传时间:2020-05-24 格式:PDF 页数:34 大小:416.24KB
返回 下载 相关 举报
使用VC++的网络编程总结_第1页
第1页 / 共34页
使用VC++的网络编程总结_第2页
第2页 / 共34页
使用VC++的网络编程总结_第3页
第3页 / 共34页
使用VC++的网络编程总结_第4页
第4页 / 共34页
使用VC++的网络编程总结_第5页
第5页 / 共34页
点击查看更多>>
资源描述

《使用VC++的网络编程总结》由会员分享,可在线阅读,更多相关《使用VC++的网络编程总结(34页珍藏版)》请在金锄头文库上搜索。

1、使用使用 VC VC VC VC 的网络编程总结的网络编程总结 1 套接字编程原理 1 1 Client server 通信模型 1 2 WindowsSockets 规范 1 3 套接字 1 3 1 套接字定义 1 3 2 分类 1 3 3 套接字的作用 1 3 4 端口与地址 1 3 5 套接口属性 2 基本的 Windows SocketsAPI 编程 2 1 常用函数 2 2 TCP 实例 2 3 UDP 实例 2 4 Socket 通信阻塞的解决方法 3 MFC 下的 Socket 编程的类 3 1 CAsyncSocket 类 3 2 CSocket 类 3 3 WindowsSo

2、ckets 带存档的套接字的工作方式 3 4 流式套接字通信的操作顺序 3 5 使用 CAsyncSocket 类 3 6 从套接字类派生 3 7 套接字通知 3 8 一个使用 CSocket 类的网络通信实例 3 8 1 服务器端应用程序设计 ServerDemo 3 8 2 客户端应用程序设计 项目名称 ClientDemo 4 套接字的托管实现 4 1 System Net Sockets 命名空间 4 2 实例 一个新邮件检查器 5 怎样实现服务器端多线程的 socket 功能 1 1 1 1 套接字编程原理 套接字编程原理 一个完整的网间通信进程需要由两个进程组成 并且只能用同一种高

3、层协议 也就是说 不可能通信的一端用 TCP 而另一端用 UDP 一个完整的网络信需要一个五元组来标识 协议 本地地址 本地端口号 远端地址 远端端口号 1 11 11 11 1C C C Client serverlient serverlient serverlient server通信模型通信模型 在客户 服务器模式中我们将请求服务的一方称为客户 client 将提供某种服务的一方 称为服务器 server 一个服务程序通常在一个众所周知的地址监听对服务的请求 也就是说服务进程一直处 于休眠状态 直到一个客户对这个服务的地址提出了连接请求 在这个时刻 服务程序被 惊 醒 并且为客户提供服

4、务 对客户的请求作出适当的反应 虽然基于连接的服务是设计客户 机 服务器应用程序时的标准 但有些服务也是可以通过无连接的接口提供的 客户机 服务器的请求 响应过程示意图如下所示 图 1 客户 服务器通信模型 通过上面的分析 我们不难理解一个一个完整的网络应用程序包括客户端和服务器两个 部分 客户与服务器进程的作用是非对称的 因此编码不同 服务进程一般是等待客户请求 而启动的 只要系统运行 该服务进程一直存在 直到终止或强迫终止 1 2 WindowsSockets 规范 Windows Sockets 规范是 90 年代初 Microsoft 公司联合其他几家大公司共同制定的一套 在 Wind

5、ows下的二进制兼容网络编程接口规范 它以 U C Berkeley 大学 BSD UNIX 中流行 的 Socket 接口为基础 主要在其上扩充了一组针对 Windows 的扩展库函数 增加了符合 Windows 消息驱动特性的网络事件异步选择机制 以使程序员能够充分利用 Windows 消息 驱动机制进行编程 Windows Sockets 的用途是将基础网络抽象出来 这样 您不必对网络非常了解 并且 您的应用程序可在任何支持套接字的网络上运行 它为应用程序开发者定义了一套简单统一 的 API 并让各家网络软件供应商共同遵守 Windows Sockets 规范从 90 年代初的 1 0

6、版本开始 经过不断的完善和发展 目前已经 有了 Windows Sockets 2 版本 值得注意的是 Microsoft 的 MFC 库现在只支持 Windows Sockets 1 版本 不支持 Windows Sockets 2 版本 MFC 提供了两个类用以封装 Windows Sockets API 一个是 CAsyncSocket 类 它主要 是提供给那些具有一定网络编程经验 希望同时拥有 Socket API 编程的灵活性和类库编程便 利性的开发者的 另一个是 CSocket 类 它由 CAsyncSocket 类派生 它具有更高的抽象化 致力于简化网络编程所需的操作 1 31

7、31 31 3 套接字套接字 1 3 11 3 11 3 11 3 1 套接字套接字定义定义 套接字是一个通信终结点 它是 Sockets 应用程序用来在网络上发送或接收数据包的对 象 套接字具有类型 与正在运行的进程相关联 并且可以有名称 目前 套接字一般只与 使用网际协议组的同一 通信域 中的其他套接字交换数据 使用套接字的应用程序间通信模 型如图 2 所示 应 用 程 序应 用 程 序A A A A 套 接 字套 接 字A A A A 应 用 程 序应 用 程 序B B B B 套 接 字套 接 字B B B B 图图2 2 2 2 套接字通信模型套接字通信模型 1 3 21 3 21

8、3 21 3 2分类分类 可用的套接字类型有以下两种 1 3 2 11 3 2 11 3 2 11 3 2 1流式套接字流式套接字 流式套接字提供没有记录边界的数据流 即字节流 字节流能确保以正确的顺序无重 复地被送达 创建并初始化套接字创建并初始化套接字 监听来自客户机的请求监听来自客户机的请求 接 受 连 接 请 求接 受 连 接 请 求 接 收 数 据接 收 数 据 发 送 数 据发 送 数 据 关 闭 连 接关 闭 连 接 创建并初始化套接字创建并初始化套接字 请 求 建 立 连 接请 求 建 立 连 接 发 送 数 据发 送 数 据 接 收 数 据接 收 数 据 关 闭 连 接关 闭

9、 连 接 服 务 器服 务 器 客 户 机客 户 机 图3 流 式 套 接 字 有 连 接 通 信 编 程 1 3 2 21 3 2 21 3 2 21 3 2 2 数据报套接字数据报套接字 数据报套接字支持面向记录的数据流 但不能确保能被送达 也无法确保按照发送顺 序或不重复 创建并初始化套接字创建并初始化套接字 监听来自客户机的请求监听来自客户机的请求 进 行 处 理进 行 处 理 发送结果给客户端发送结果给客户端 关 闭 连 接关 闭 连 接 创建并初始化套接字创建并初始化套接字 向服务器发出请求向服务器发出请求 接 收 结 果接 收 结 果 关 闭 连 接关 闭 连 接 服 务 器服

10、务 器 客 户 机客 户 机 图图4 4 4 4 数据报套接字数据报套接字 无 连 接 通 信无 连 接 通 信 编 程编 程 有序 指数据包按发送的顺序送达 不重复 指一个特定的数据包只能获取一次 这两 种套接字都是双向的 是可以同时在两个方向上 全双工 进行通信的数据流 注意注意 在某些网络协议下 如 XNS 流可以面向记录 即作为记录流而非字节流 但 在更常用的 TCP IP 协议下 流为字节流 WindowsSockets 提供与基础协议无关的抽象化 级别 1 3 31 3 31 3 31 3 3 套接字的作用套接字的作用 套接字的作用非常大 至少在下面三种通信上下文中如此 客户端 服

11、务器模型 对等网络方案 如聊天应用程序 通过让接收应用程序将消息解释为函数调用来进行远程过程调用 RPC 1 3 41 3 41 3 41 3 4端口与地址端口与地址 在网络上 一个套接字的标识主要借助于地址和端口来描述 套接字的地址指该套接字所在计算机的网络地址 可以为域名或 IP 地址的形式 通常 创建套接字时不必指明网络地址 只有在拥有多个网络地址的机器时 才需要显式指定一个 网络地址 同一机器上可以运行多个网络应用程序 每个应用程序都有自己的套接字用以进行网 络通信 此时如果只有地址标识套接字 则当一个通信包到达机器时 将无法确定究竟是哪 个应用程序的套接字需要接收此信息 由此增加了端

12、口的概念 以协助区分同一机器上不同 应用程序的套接字 端口用于标识进程 同一机器上不同的网络应用程序各有不同的端口 这样 通过 网 络地址 端口号 的标识方法 便唯一标识了机器上的应用程序了 某些端口是专门为公共服务保留的 Ftp 21 http 80 除非程序是要提供这些服务 否 则应尽量避免使用这些端口 一般来说 端口 1024 以前的端口号都是系统保留的或是作为 公共服务的 应尽量选择大于 1024 的端口号 以避免冲突 1 3 5 套接口属性 套接口有一系列的属性用于标识套接口的状态等信息 它们的属性如表 1 所示 表表 1 1 1 1 套接口属性套接口属性 选项类型含义缺省值 SO

13、ACCEPTCONBOOL套接口正在监听FALSE SO BROADCASTBOOL套接口设置为可发送广播数据FALSE SO DEBUGBOOL允许 DebugFALSE SO DONTLINGERBOOL是否禁止 SO LINGER 选项TRUE SO DONTROUTEBOOL路由被禁止FALSE SO ERRORint得到并且清除错误状态0 SO KEEPALIVEBOOL活跃信息正在被发送FALSE SO LINGERstruct返回目前的 linger 信息1 onoff SO OOBINLINEBOOL带外数据正在普通数据流中被接收FALSE SO RCVBUFint接收缓冲区大

14、小与具体实现有关 SO REUSEADDRBOOL该套接口捆绑的地址可否被他人使用FALSE SO SNDBUFint发送缓冲区大小与具体实现有关 SO TYPEint套接口类型与接口类型有关 TCP NODELAYBOOL禁止采用 Nagle 进行合并传送与具体实现有关 可以通过可以通过 getsockopt getsockopt getsockopt getsockopt 函数获取套接口的属性函数获取套接口的属性 也可以通过也可以通过 setsockopt setsockopt setsockopt setsockopt 函数设置套接口函数设置套接口 的属性 的属性 2 2 2 2 基本的

15、基本的 WindowsWindowsWindowsWindows SocketsSocketsSocketsSocketsAPIAPIAPIAPI编程编程 需要在程序中添加下面的包含语句 需要在程序中添加下面的包含语句 include include include include 使用使用 vc vc vc vc 编译时需添加编译链接依赖项编译时需添加编译链接依赖项 ws2 32 libws2 32 libws2 32 libws2 32 lib库库 协议寻址协议寻址 在 winsock 中 应用程序通过 sockaddr in 结构来指定 IP 地址和服务端口信息 sockaddr in

16、internetAddr intnPortID 5320 internetAddr sin family AF INET internet sin addr s addr inet addr 202 202 42 88 INADDR ANY internet sin port htons nPortID ip 地址不容易记忆 还提供了许多地址和名称解析函数如 gethostbyname gethostbyaddr 等 2 12 12 12 1常用函数常用函数 1 WSAStartup 调用 windowsSocket DLL 函数原型intWSAStartup WORD wVersionRequested 应用程序要求的 sockets 版本 LPWSADATAlpWSAData 指向数据结构 WSDATA 的指针 得到 windowsSocket 的具体信息 WSDATA 定义如下 typedef struct WSAData WORDwVersion WORDwHighVersion ifdef WIN64 unsigned shortiMaxSockets unsigned sh

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 教学/培训

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号