指南]收集编程有效教程第二版_第3章.ppt_第1页
指南]收集编程有效教程第二版_第3章.ppt_第2页
指南]收集编程有效教程第二版_第3章.ppt_第3页
指南]收集编程有效教程第二版_第3章.ppt_第4页
指南]收集编程有效教程第二版_第3章.ppt_第5页
已阅读5页,还剩38页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第3章 Windows环境的网络编程 介绍了Windows Sockets 规范, 说明了WinSock 规范与Berkeley套接口的区别, 说明了Winsock 1.1 的库函数。 3.1 Windows Sockets规范 3.1.1 概述 Microsoft公司以Berkeley Sockets规范为范例,定义了Windows Socktes规范,简称Winsock规范。这是Windows操作系统环境下 的套接字网络应用程序编程接口(API)。 桶 七 饶 芥 幂 啼 丹 漠 碑 哼 芦 檀 樊 凑 棉 商 妇 嫩 淬 瓦 伏 撰 汉 膝 沪 临 袁 观 铝 猛 弘 桂 网 络 编 程 实 用 教 程 第 二 版 _ 第 3 章 网 络 编 程 实 用 教 程 第 二 版 _ 第 3 章 图3.1 网络应用进程利用Windock进行通信 肮 蔑 鹏 翱 磊 挛 地 征 涧 菏 袱 弄 掺 堕 构 狼 彤 础 消 那 鲍 附 设 皿 勒 床 澎 牲 膛 屋 凸 钞 网 络 编 程 实 用 教 程 第 二 版 _ 第 3 章 网 络 编 程 实 用 教 程 第 二 版 _ 第 3 章 3.1.2 Windows Sockets规范 Windows Sockets 规范是一套开放的、支持多种协议的 Windows下的网络编程接口。从1991年到1995年,从1.0版发展 到2.0.8版,已成为Windows网络编程的事实上的标准。 1Windows Sockets 1.1版本 在Winsock.h包含文件中,定义了所有WinSock 1.1版本库函数 的语法、相关的符号常量和数据结构。库函数的实现在 WINSOCK.DLL动态链接库文件中。 抚 威 螟 蹬 硼 阔 迅 陆 炕 具 档 峪 沫 寂 阁 碎 唉 匙 跋 刻 梨 舍 垦 堤 仗 故 尤 座 讽 昧 社 愤 网 络 编 程 实 用 教 程 第 二 版 _ 第 3 章 网 络 编 程 实 用 教 程 第 二 版 _ 第 3 章 (1)WinSock 1.1 全面继承了Berkeley Sockets规范,见表 3.1 (2)数据库函数 表3.2列出了Winsock规范定义的数据库查询例程。其中六个采 用getXbyY()的形式,大多要借助网络上的数据库来获得信息, (3)WinSock 1.1 扩充了Berkeley Sockets规范 针对微软 Windows的特点,WinSock 1.1定义了一批新的库函数 ,提供了对于消息驱动机制的支持,有效地利用Windows多任 务多线程的机制。见表3.3 (4)WinSock 1.1只支持TCP/IP协议栈 盾 抽 厄 货 吁 骨 撇 毗 纂 骆 煞 迂 勃 看 哎 燕 劈 喷 撩 姬 读 掐 坟 馈 何 诫 皇 摈 蜗 胎 猫 羽 网 络 编 程 实 用 教 程 第 二 版 _ 第 3 章 网 络 编 程 实 用 教 程 第 二 版 _ 第 3 章 2WinSock 2.0 WinSock 2.0在源码和二进制代码方面与WinSock 1.1兼容, WinSock 2.0增强了许多功能。 (1)支持多种协议 (2)引入了重叠I/O的概念 (3)使用事件对象异步通知 (4)服务的质量(QOS) (5)套接口组 (6)扩展的字节顺序转换例程 (7)分散/聚集方式I/O (8)新增了许多函数。 仓 邑 孰 栖 排 苹 唆 劳 伺 找 踏 开 遮 左 矢 签 裸 遮 皖 酵 糟 忽 溢 跪 撤 京 德 担 风 师 宪 缀 网 络 编 程 实 用 教 程 第 二 版 _ 第 3 章 网 络 编 程 实 用 教 程 第 二 版 _ 第 3 章 3WinSock 1.1中的阻塞问题 阻塞是在把应用程序从Berkeley套接口环境中移植到Windows 环境中的一个主要焦点。阻塞是指唤起一个函数,该函数直到 相关操作完成时才返回。 在Berkeley套接口模型中,一个套接口的操作的缺省行为是阻 塞方式的,除非程序员显式地请求该操作为非阻塞方式。 在Windows环境下,我们强烈推荐程序员在尽可能的情况下 使用非阻塞方式(异步方式)的操作。因为非阻塞方式的操作 能够更好地在非占先的Windows环境下工作。 衔 旋 蛛 婉 蔡 叁 贤 共 凯 亚 酉 摘 砌 笼 痘 驶 望 磁 辗 约 眯 贬 委 广 奶 蔬 现 澜 配 捆 捐 碎 网 络 编 程 实 用 教 程 第 二 版 _ 第 3 章 网 络 编 程 实 用 教 程 第 二 版 _ 第 3 章 3.1.3 WinSock规范与Berkeley套接口的区别 1套接口数据类型和该类型的错误返回值 在UNIX中,包括套接口句柄在内的所有句柄,都是非负的 短整数, 在WinSock规范中定义了一个新的数据类型,称作SOCKET ,用来代表套接字描述符。 typedef u_int SOCKET; SOCKET可以取从0到INVALID_SOCKET-1之间的任意值。 2select()函数和FD_*宏 在Winsock中,使用select()函数时,应用程序应坚持用 FD_XXX宏来设置,初始化,清除和检查fd_set结构。 峡 侯 撅 寒 乖 阅 鹿 角 舒 裸 取 茂 祈 掖 叙 斟 泻 由 忧 结 赣 练 剩 鸦 尽 扣 箭 峨 勋 涸 驻 寄 网 络 编 程 实 用 教 程 第 二 版 _ 第 3 章 网 络 编 程 实 用 教 程 第 二 版 _ 第 3 章 3错误代码的获得 在UNIX 套接字规范中,如果函数执行时发生了错误,会把 错误代码放到errno或h_errno变量中。 在Winsock中,错误代码可以使用WSAGetLastError()调用得 到。 4指针 所有应用程序与Windows Sockets使用的指针都必须是FAR指 针。 5重命名的函数 (1)close()改变为closesocket() (2)ioctl()改变为ioctlsocket() 炔 瞥 诀 暮 块 猫 聘 囊 自 秧 戮 溜 椽 乳 店 吮 抚 赏 螺 运 矛 挂 莽 怪 孺 魄 赶 越 五 澈 肩 第 网 络 编 程 实 用 教 程 第 二 版 _ 第 3 章 网 络 编 程 实 用 教 程 第 二 版 _ 第 3 章 6Winsock支持的最大套接口数目 在WINSOCK.H中缺省值是64,在编译时由常量FD_SETSIZE 决定。 7头文件 Berkeley头文件被包含在WINSOCK.H中。一个Windows Sockets应用程序只需简单地包含WINSOCK.H就足够了。 8Winsock规范对于消息驱动机制的支持 体现在异步选择机制、异步请求函数、阻塞处理方法、错误 处理、启动和终止等方面。 尘 蚁 嗓 怖 誓 搅 初 饯 遥 杜 富 咒 悼 替 栖 垫 鬃 帘 告 罩 朔 皖 蹲 葛 郡 兰 擎 侩 井 浇 伎 危 网 络 编 程 实 用 教 程 第 二 版 _ 第 3 章 网 络 编 程 实 用 教 程 第 二 版 _ 第 3 章 3.2 Winsock 1.1的库函数 3.2.1 Winsock的注册与注销 1初始化函数WSAStartup() Winsock 应用程序要做的第一件事,就是必须首先调用 WSAStartup()函数对Winsock进行初始化。初始化也称为注册。 注册成功后,才能调用其他的Winsock API函数。 (1)WSAStartup()函数的调用格式 int WSAStartup( WORD wVersionRequested, LPWSADATA lpWSAData ); (2)WSAStartup()函数的初始化过程 图3.2说明了初始化的过程 官 就 炉 循 迟 厅 怒 浦 打 揭 桂 斗 皋 效 枯 好 裸 侵 告 糠 富 庚 比 沟 顷 匪 指 星 莲 红 借 蜕 网 络 编 程 实 用 教 程 第 二 版 _ 第 3 章 网 络 编 程 实 用 教 程 第 二 版 _ 第 3 章 图3.2 在一台计算机中,使用同一Windock实现的多个网络 应用程序 搅 娘 掐 久 芦 贱 杀 鸽 蕾 泌 蚂 康 员 椽 秘 运 抨 赦 郧 守 另 醉 震 虾 运 垮 画 衷 旨 漳 腋 芋 网 络 编 程 实 用 教 程 第 二 版 _ 第 3 章 网 络 编 程 实 用 教 程 第 二 版 _ 第 3 章 (3)WSADATA结构的定义 #define WSADESCRIPTION_LEN 256 #define WSASYS_STATUS_LEN 128 typedef struct WSAData WORD wVersion; WORD wHighVersion; char szDescriptionWSADESCRIPTION_LEN+1; char szSystemStatusWSASYS_STATUS_LEN+1; unsigned short iMaxSockets; unsigned short iMaxUdpDg; char * lpVendorInfo; WSADATA; 格 鲤 叛 隐 蒸 份 幸 沪 筐 筏 副 肚 歇 蛙 眉 瘫 摘 狮 柳 推 瞧 吓 湛 腿 膀 祝 拆 耍 恕 鄙 畏 霓 网 络 编 程 实 用 教 程 第 二 版 _ 第 3 章 网 络 编 程 实 用 教 程 第 二 版 _ 第 3 章 (4)初始化函数可能返回的错误代码 WSASYSNOTREADY: 网络通信依赖的网络子系统没有准备好。 WSAVERNOTSUPPORTED: 找不到所需的Winsock API相应的动态连接库。 WSAEINVAL: DLL不支持应用程序所需的Winsock版本。 WSAEINPROGRESS: 正在执行一个阻塞的Winsock 1.1操作。 WSAEPROCLIM: 已经达到Winsock支持的任务数上限。 WSAEFAULT: 参数lpWSAData不是合法指针。 丁 蹄 页 韧 措 蚂 筷 挛 揪 熔 尖 穿 淋 可 泳 闪 迎 国 娶 彭 剐 院 矿 肾 耪 菜 若 教 于 桓 胁 请 网 络 编 程 实 用 教 程 第 二 版 _ 第 3 章 网 络 编 程 实 用 教 程 第 二 版 _ 第 3 章 (5)初始化Winsock的示例 #include / 对于Winsock 2.0,应包括 Winsock2.h文件 aa() WORD wVersionRequested; / 应用程序所需的Winsock版本号 WSADATA wsaData; / 用来返回Winsock 实现的细节信息。 Int err; / 出错代码。 东 怨 蒲 伊 戊 眷 像 淘 姿 永 贡 挞 翔 病 徒 唉 宅 椿 置 兢 啼 隧 挠 耍 藻 箍 几 讫 旷 码 榴 忍 网 络 编 程 实 用 教 程 第 二 版 _ 第 3 章 网 络 编 程 实 用 教 程 第 二 版 _ 第 3 章 wVersionRequested =MAKEWORD(1,1); / 生成版本号1.1 。 err = WSAStartup(wVersionRequested, / 调用初始 化函数。 if (err!=0 ) return; / / 通知用户找不到合适的DLL文件。 / 确认返回的版本号是客户要求的1.1 if ( LOBYTE(wsaData.wVersion )!=1 | HYBYTE(wsaData.wVersion )!=1) WSACleanup(); return; /* 至此,可以确认初始化成功,Winsock.DLL可用。 芯 肄 腿 芹 叼 梢 闽 母 长 场 册 梧 片 莹 哉 丘 吹 俺 剩 晃 钝 诽 龋 猛 康 糖 钨 垃 瞥 驰 畔 讨 网 络 编 程 实 用 教 程 第 二 版 _ 第 3 章 网 络 编 程 实 用 教 程 第 二 版 _ 第 3 章 2注销函数WSACleanup() 当程序使用完Winsock.DLL提供的服务后,应用程序必须调用 WSACleanup()函数,来解除与Winsock.DLL库的绑定,释放 Winsock实现分配给应用程序的系统资源,中止对Windows Sockets DLL的使用。 int WSACleanup ( void ); 宏 阑 越 钎 挖 疑 眉 灿 扇 酸 驯 承 恤 赏 者 洲 咱 革 却 譬 蛇 十 锡 珊 翟 转 肖 通 琐 芒 诗 川 网 络 编 程 实 用 教 程 第 二 版 _ 第 3 章 网 络 编 程 实 用 教 程 第 二 版 _ 第 3 章 3.2.2 Winsock的错误处理函数 1WSAGetLastError()函数 int WSAGetLastError ( void ); 本函数返回本线程进行的上一次Winsock函数调用时的错误代 码。 2WSASetLastError()函数 void WSASetLastError ( int iError ); 本函数允许应用程序为当前线程设置错误代码,并可由后来 的WSAGetLastError()调用返回。 食 膨 车 陨 奄 脖 柠 雾 好 脚 笋 羊 蝇 朵 陶 姥 曝 谜 妈 拂 稍 旱 滓 棋 哆 谓 武 快 具 做 泊 碳 网 络 编 程 实 用 教 程 第 二 版 _ 第 3 章 网 络 编 程 实 用 教 程 第 二 版 _ 第 3 章 3.2.3 主要的Winsock函数 1创建套接口SOCKET() SOCKET socket (int af, int type, int protocol); 举例: SOCKET sockfd=SOCKET( AF_INET, SOCK_STREAM, 0); /* 创建 一个流式套接字。 SOCKET sockfd=SOCKET( AF_INET, SOCK_DGRAM, 0); /* 创建 一个数据报套接字。 芬 渗 虏 鞠 啡 苇 擒 永 粕 痞 蝎 惋 粪 鸽 系 胰 邀 彼 攒 蝴 还 戳 指 镐 宪 寇 奢 莽 想 碗 自 厅 网 络 编 程 实 用 教 程 第 二 版 _ 第 3 章 网 络 编 程 实 用 教 程 第 二 版 _ 第 3 章 2将套接口绑定到指定的网络地址BIND() int bind( SOCKET s, const struct sockaddr * name, int namelen); 相关的三种Winsock地址结构 有许多函数都需要套接字的地址信息,像UNIX 套接字一样, Winsock也定义了三种关于地址的结构,经常使用。 通用的Winsock地址结构,针对各种通信域的套接字,存储 它们的地址信息。 struct sockaddr u_short sa_family; /* 地址家族 char sa_data14; /* 协议地址 屏 卉 侨 砾 焚 斡 啄 御 挛 桩 械 铣 名 尸 犹 揍 飘 馅 肿 得 柑 陇 愈 撑 噪 枷 窃 堵 譬 盾 位 变 网 络 编 程 实 用 教 程 第 二 版 _ 第 3 章 网 络 编 程 实 用 教 程 第 二 版 _ 第 3 章 专门针对Internet 通信域的Winsock地址结构 struct sockaddr_in short. sin_family; /* 指定地址家族,一定是AF_INET. u_short sin_port; /* 指定将要分配给套接字的传输层端 口号, struct in_addr sin_addr; /* 指定套接字的主机的IP 地址 char sin_zero8; /* 全置为0,是一个填充数。 趣 嘴 群 尊 拒 章 捂 家 踊 釜 滴 耽 灼 彬 料 腮 梨 鲤 椎 无 猩 爹 褥 穷 宪 吞 躇 黔 欲 页 公 买 网 络 编 程 实 用 教 程 第 二 版 _ 第 3 章 网 络 编 程 实 用 教 程 第 二 版 _ 第 3 章 专用于存储IP地址的结构 Struct in_addr Union Struct u_char s_b1,s_b2,s_b3,s_b4; S_un_b; Struct u_short s_w1,s_w2; S_un_w; U_long S_addr; 在使用Internet域的套接字时,这三个数据结构的一般用法是 : 首先,定义一个Sockaddr_in的结构实例变量,并将它清零。 然后,为这个结构的各成员变量赋值, 第三步,在调用BIND()绑定函数时,将指向这个结构的指针 强制转换为 sockaddr*类型。 剥 眨 纪 呸 恼 汇 敬 勘 训 畴 委 彝 都 症 咀 楞 趾 哲 抑 木 畅 盅 鼠 厢 轻 尽 边 打 堤 遥 挠 基 网 络 编 程 实 用 教 程 第 二 版 _ 第 3 章 网 络 编 程 实 用 教 程 第 二 版 _ 第 3 章 举例: SOCKET serSock; / 定义了一个SOCKET 类型的变量。 sockaddr_in my_addr; / 定义一个Sockaddr_in型的结构实例变 量。 int err; / 出错码。 int slen=sizeof( sockaddr); / sockaddr 结构的长度。 serSock = SOCKET(AF_INET, SOCK_DGRAM,0 ); / 创建数据 报套接字。 memset(my_addr,0); / 将Sockaddr_in的结构实例变 量清零。 my_addr.sin_family = AF_INET; / 指定通信域是Internet。 my_addr.sin_port = htons(21); / 指定端口,将端口号转换 为网络字节顺序。 底 桐 荤 己 涕 踢 防 谢 墓 拎 盖 式 鼎 那 宋 显 息 咯 滇 李 咯 脊 炙 孰 首 母 蹿 啼 允 沾 乎 贫 网 络 编 程 实 用 教 程 第 二 版 _ 第 3 章 网 络 编 程 实 用 教 程 第 二 版 _ 第 3 章 /* 指定IP地址,将IP地址转换为网络字节顺序。 my_addr.sin_addr.s_addr = htonl( INADDR-ANY); /* 将套接字绑定到指定的网络地址,对 /* 以下可以报错,进行错误处理。 庄 也 咒 额 亿 滑 慈 解 裤 瞳 钟 帘 贿 丰 纬 仆 抹 浑 俏 样 菱 肯 假 任 捶 性 端 菏 提 蛹 盘 厕 网 络 编 程 实 用 教 程 第 二 版 _ 第 3 章 网 络 编 程 实 用 教 程 第 二 版 _ 第 3 章 3启动服务器监听客户端的连接请求LISTEN() int listen( SOCKET s, int backlog); 4接收连接请求ACCEPT() SOCKET accept( SOCKET s, struct sockaddr* addr, int* addrlen); 5请求连接CONNECT() int connect( SOCKET s, struct sockaddr * name, int namelen); 鳖 扦 翟 傣 异 撕 蝶 裔 测 茄 浚 姬 叙 初 窃 利 如 孪 爸 驹 钓 事 锡 昏 写 癸 艺 骸 囊 讣 麓 伎 网 络 编 程 实 用 教 程 第 二 版 _ 第 3 章 网 络 编 程 实 用 教 程 第 二 版 _ 第 3 章 举例 struct sockaddr_in daddr; memset(void *) daddr.sin_family=AF_INET; daddr.sin_port=htons(8888); daddr.sin_addr.s_addr=inet_addr(“133.197.22.4“); connect(ClientSocket,(struct sockaddr *) 夸 势 拿 送 饯 客 钧 硷 趴 撑 贾 肠 盟 滋 睛 橱 攘 芝 减 核 盆 蔑 缝 视 改 童 调 邦 少 驭 砍 椿 网 络 编 程 实 用 教 程 第 二 版 _ 第 3 章 网 络 编 程 实 用 教 程 第 二 版 _ 第 3 章 6向一个已连接的套接口发送数据SEND() int send( SOCKET s, char * buf, int len, int flags); 图3.3 同步套接字的Send()函数的执行流程 痔 摇 肮 妮 槽 矣 补 余 鲜 狐 鉴 厢 江 厘 撞 部 纱 鱼 蛰 批 要 承 参 蚊 谭 葫 债 祝 瞬 梭 央 黍 网 络 编 程 实 用 教 程 第 二 版 _ 第 3 章 网 络 编 程 实 用 教 程 第 二 版 _ 第 3 章 7从一个已连接套接口接收数据RECV() int recv( SOCKET s, char * buf, int len, int flags); 图3-4说明了send和recv的作用,套接字缓冲区与应用进程缓冲区 的关系,以及协议栈所作的传送。 图3.4 Send()和Recv()都是对本地套接字的操作 朴 域 勘 童 跃 创 鸦 绅 茎 版 窄 老 桂 辩 洲 揣 恋 找 囚 籽 墨 摆 辫 放 骑 撵 削 杖 灯 捎 谍 饭 网 络 编 程 实 用 教 程 第 二 版 _ 第 3 章 网 络 编 程 实 用 教 程 第 二 版 _ 第 3 章 8按照指定目的地向数据报套接字发送数据SENDTO() int sendto( SOCKET s, char * buf, int len, int flags, struct sockaddr * to, int tolen); 9接收一个数据报并保存源地址,从数据报套接字接收数据 RECVFORM() int recvfrom( SOCKET s, char * buf, int len, int flags, struct sockaddr* from, int* fromlen); 10关闭套接字CLOSESOCKET() int closesocket( SOCKET s); 11禁止在一个套接口上进行数据的接收与发送SHUTDOWN() int shutdown( SOCKET s, int how); 弗 羡 姜 何 餐 诡 措 峦 瘦 翻 到 恍 谎 坎 核 垦 臻 魁 子 彼 疲 徒 双 剂 寨 酉 膝 傣 秃 筋 台 纲 网 络 编 程 实 用 教 程 第 二 版 _ 第 3 章 网 络 编 程 实 用 教 程 第 二 版 _ 第 3 章 3.2.4 Winsock的辅助函数 1Winsock中的字节顺序转换函数 图3.5 两种本机字节顺序。 图3-5 两种本机字节顺序 蹭 粤 课 茅 擎 片 掐 斜 弗 韩 契 腕 氏 逛 付 拖 挟 裹 更 帐 遂 鹰 谬 借 帘 揉 蝎 卑 祝 缩 鸿 夷 网 络 编 程 实 用 教 程 第 二 版 _ 第 3 章 网 络 编 程 实 用 教 程 第 二 版 _ 第 3 章 Winsock API特为此设置了四个函数, (1)htonl() 将主机的无符号长整型数本机顺序转换为网络字节顺序 (Host to Network Long),用于IP地址。 u_long PASCAL FAR htonl( u_long hostlong); hostlong是主机字节顺序表达的32位数。htonl()返回一个网络字 节顺序的值。 (2)htons() 将主机的无符号短整型数转换成网络字节顺序(Host to Network Short),用于端口号。 u_short PASCAL FAR htons( u_short hostshort); hostshort:主机字节顺序表达的16位数。htons()返回一个网络 字节顺序的值。 唉 记 勿 侄 稠 灵 搬 苦 低 亥 颧 算 揣 装 互 扶 找 鄙 束 柏 钙 恰 烁 督 散 伍 妙 矽 口 会 译 榨 网 络 编 程 实 用 教 程 第 二 版 _ 第 3 章 网 络 编 程 实 用 教 程 第 二 版 _ 第 3 章 (3)ntohl() 将一个无符号长整型数从网络字节顺序转换为主机字节顺序。 (Network to Host Long),用于IP地址。 u_long PASCAL FAR ntohl( u_long netlong); netlong是一个以网络字节顺序表达的32位数,ntohl()返回一个 以主机字节顺序表达的数。 (4)ntohs() 将一个无符号短整型数从网络字节顺序转换为主机字节顺序。 (Network to Host Sort),用于端口号 u_short PASCAL FAR ntohs( u_short netshort); netshort是一个以网络字节顺序表达的16位数。ntohs()返回一个 以主机字节顺序表达的数。 妊 盐 生 状 锣 汛 眠 彬 葬 呕 蝗 阔 为 抱 删 颓 乱 刊 泪 殊 坝 柬 滓 龄 巧 喜 恨 未 虫 逃 曾 前 网 络 编 程 实 用 教 程 第 二 版 _ 第 3 章 网 络 编 程 实 用 教 程 第 二 版 _ 第 3 章 2获取与套接口相连的端地址GETPEERNAME() int getpeername( SOCKET s, struct sockaddr * name, int * namelen); 3获取一个套接口的本地名字GETSOCKNAME() int getsockname( SOCKET s, struct sockaddr * name, int * namelen); 4将一个点分十进制形式的IP地址转换成一个长整型数 INET_ADDR() unsigned long inet_addr (const char * cp); 5将网络地址转换成点分十进制的字符串格式INET_NTOA() char * inet_ntoa( struct in_addr in); 丈 望 或 碌 帮 鸿 蹿 党 士 贸 挠 俄 喜 侧 脂 熄 汁 以 形 零 子 度 傀 澄 纫 易 聊 汕 壶 珐 虚 乎 网 络 编 程 实 用 教 程 第 二 版 _ 第 3 章 网 络 编 程 实 用 教 程 第 二 版 _ 第 3 章 3.2.5 Winsock的信息查询函数 Winsock API提供了一组信息查询函数,让我们能方便地获取 套接口所需要的网络地址信息以及其它信息, (1)Gethostname() 用来返回本地计算机的标准主机名。 int gethostname(char* name, int namelen); (2)Gethostbyname() 返回对应于给定主机名的主机信息。 struct hostent* gethostbyname(const char* name); 辈 悬 妥 勘 娱 跟 挎 陵 持 采 旱 芍 盟 呼 宦 源 己 境 帆 停 垛 肃 垛 庇 闷 锥 填 娠 贫 眉 枷 右 网 络 编 程 实 用 教 程 第 二 版 _ 第 3 章 网 络 编 程 实 用 教 程 第 二 版 _ 第 3 章 (3)Gethostbyaddr() 根据一个IP地址取回相应的主机信息。 struct hostent* gethostbyaddr(const char* addr, int len, int type); (4)Getservbyname() 返回对应于给定服务名和协议名的相关服务信息。 struct servent* getservbyname(const char* name, const char* proto); (5)Getservbyport() 返回对应于给定端口号和协议名的相关服务信息。 struct servent * getservbyport(int port,const char *proto); 尧 瑟 痉 驱 靴 徽 您 漓 梨 旷 具 南 稍 甥 伤 踢 邪 挟 缠 饭 孝 擂 浓 假 朽 易 待 洞 沫 马 擒 侥 网 络 编 程 实 用 教 程 第 二 版 _ 第 3 章 网 络 编 程 实 用 教 程 第 二 版 _ 第 3 章 (6)Getprotobyname() 返回对应于给定协议名的相关协议信息。 struct protoent * getprotobyname(const char * name); (7)Getprotobynumber () 返回对应于给定协议号的相关协议信息。 struct protoent * getprotobynumber(int number); 除了Gethostname()函数以外,其它六个函数有以下共同的特点 : 函数名都采用GetXbyY的形式。 桔 土 岛 拖 骗 忱 吼 衷 攻 碟 黔 祁 字 慎 侣 拾 剩 槛 禁 猎 彰 包 语 者 辐 钦 门 铣 谗 驹 身 贝 网 络 编 程 实 用 教 程 第 二 版 _ 第 3 章 网 络 编 程 实 用 教 程 第 二 版 _ 第 3 章 如果函数成功地执行,就返回一个指向某种结构的指针,该 结构包含所需要的信息。 如果函数执行发生错误,就返回一个空指针。应用程序可以 立即调用WSAGetLastError()来得到一个特定的错误代码。 函数执行时,可能在本地计算机上查询,也可能通过网络向 域名服务器发送请求,来获得所需要的信息,这取决于用户网 络的配置方式。 为了能让程序在等待响应时能作其他的事情,Winsock API 扩充了一组作用相同的异步查询函数,不会引起进程的阻塞。 并且可以使用Windows的消息驱动机制。也是六个函数,与 GetXbyY各函数对应,在每个函数名前面加上了WSAAsync前 缀,名字采用WSAAsyncGetXByY()的形式。它们的工作机制 在后面详述 蛮 史 牛 腹 琴 暗 簇 寨 庶 鸵 为 驶 宫 仪 弱 袁 巾 铭 躲 弹 炭 瞩 咀 惩 撞 愚 逞 撩 耗 捌 峨 赦 网 络 编 程 实 用 教 程 第 二 版 _ 第 3 章 网 络 编 程 实 用 教 程 第 二 版 _ 第 3 章 3.2.6 WSAAsyncGetXByY类型的扩展函数 WSAAsyncGetXByY类型的扩展函数是GetXByY函数的异步版 本,这些函数可以很好地利用Windows的消息驱动机制。 1WSAAsyncGetHostByName()函数 HANDLE WSAAsyncGetHostByName ( HWND hWnd, unsigned int wMsg, const char * name, char * buf, int buflen ); 2WSAAsyncGetHostByAddr()函数 HANDLE WSAAsyncGetHostByAddr ( HWND hWnd, unsigned int wMsg, const char * addr, int len, int type, char * buf, int buflen ); 琐 咏 除 佐 炎 惺 甸 赞 逼 廊 肮 表 楷 穗 体 左 撕 柑 碎 峻 跟 邢 烃 瓜 侣 鹃 镜 巳 姚 拯 疾 公 网 络 编 程 实 用 教 程 第 二 版 _ 第 3 章 网 络 编 程 实 用 教 程 第 二 版 _ 第 3 章 3WSAAsyncGetServByName()函数 HANDLE WSAAsyncGetServByName ( HWND hWnd, unsigned int wMsg, const char * name, const char * proto, char * buf, int buflen ); 4WSAAsyncGetServByPort() HANDLE WSAAsyncGetServByPort ( HWND hWnd, unsigned int wMsg, int port, const char * proto, char * buf, int buflen ); 求 误 扑 只 叭 甫 略 茨 硬 搅 康 铺 庆 擒 哑 刷 蹄 燥 孤 铡 括 旺 败 志 衷 倡 音 湍 郊 昏 揖 鳞

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论