新编C语言SOCKET编程指南.pdf

所需积分/C币:9 2016-11-07 10:48:16 262KB PDF
15
收藏 收藏
举报

新编C语言SOCKET编程指南.pdf
会话层 传输层 网终层 数据链路层 物理层 物理层是硬件串凵,以太网等等。应用层是和硬件层相隔最远的它是用户和网络交互的地方。 这个模型如此通用,如果你想,你可以把它作为修车指南。把它对应到 结果是 应用层 传输层 层 和路由 网络访问层 网络层,数据链路层和物理层 现在,你可能看到这些层次如何协调来封装原始的数据了 看看建立一个简单的数据包有多少工作?哎呀,你将不得不使用来建立数据包头!这仅仅是个玩笑。对 于流式套接字你要作的是发送数据。对于数据报式套接字,你按照你选择的方式封装数据然后使用 。内核将为你建立传输层和 层,硬件完成网络访问层。这就是现代科技。 现在结束我们的网络理论速成班。哦,忘记告诉你关于路由的事情了。但是我不准备谈它,如果你真的关心, 那么参考 结构体 终于谈到编程了。在这章,我将谈到被套接字用到的各种数据类型。因为它们中的一些内容很重要了 首先是简单的一个: 描述符。它是下面的类型 仅仅是一个常见的 从现在起,事情变得不可思议了,而你所需做的就是继续看下去。注意这样的事实:有两种字节排列顺序:重 要的字节有时叫 ,即八位位组在前面,或者不重要的字节在前面。前一种叫网终字节顺序 。有些机器在内部是按照这个顺序储存数据,而另外一些则不然。当我说某数据必须按照顺 序,那么你要调用函数例如 来将它从本机字节顺序 转换过来。如耒我没有提到 那么就让它保持本机字节顺序。 我的第一个结构在这个技术手册中 这个结构为许多类型的套接字储存套接字地址信息 地址家族 字节协议地址 能够是各种各样的类型,但是在这篇文章中都是 包含套接字中的目标地址和端 口信息。这好像有点不明智 为了处理 ,程序员创造了一个并列的结构 代表 通信类型 端I 地址 结构的长度相同 用这个数据结构可以轻松处理套接字地址的基本元素。注意 它被加入到这个结构,并且长度和 样应该使用函数 来全部置零。同时,这一重要的字节,一个指向 结构体的指针也可以被指向结构体 并且代替它。这样的话即使 想要的是 你仍然可以使用 ,并且在最后转换。同时,注意 和 中的 致并能够设置为 。最后, 和 必须是网络字节顺序 你也许会反对道:但是,怎么让整个数据结构 按照网络字节顺序呢要知道这个问题 的答案,我们就要仔细的看一看这个数据结构 有这样一个联合 地址个与历史有关的结构 它曾经是个最坏的联合,但是现在那些日子过去了。如果你声明 是数据结构 的实例, 那么 就储存字节的地址使用网络字节顺序。如果你不幸的系统使用的还是恐怖 的联合 ,你还是可以放心字节的地址并且和上面我说的一样这是因为使用了 本机转换 我们现在到了新的章节。我们曾纾讲了很多网络到本机字节顺序的转换,现在可以实践了! 你能够转换两种类型: 两个字节和四个字节。这个函数对于变量类型 也适用。假设 你想将从本机字节顺序转换为网终字节顺序。用表小本机 ,接着是,然后用表 示网终 ,最后用表示 或者 太简单了 如果不是太傻的话,你一定想到了由 和形成的正确组合,例如这里肯定没有 函数,不仅在这里没有,所有场合都没有。但是这里有: 现在,你可能想你已经知道它们了。你也可能想:如果我想改变的顺序要怎么办呢但是你也许马上 就想到,用不着考虑的。你也许会想到:我的 机器己经使用了恻络字节顺序,我没有必要去调用 转换地址。你可能是对的,但是当你移植你的稈序到别的机器上的时侯,你的稈序将失败。可移植性!这 里是 世界!记住:在你将数据敚到网络上的时候,桷信它们是网终字节顺序的。 最后一点:为什么在数据结构 中 和 需要转换为网络字节顺序,而 需不需要呢答案是 和 分别封装在包的和 层。因此,它们必须要是 网络字节顺序。但是 域只是被内核 使用来决定在数据结构中包含什么类型的地址,所以 它必须是本机字节顺序。同时, 没有发送到网络上,它们可以是本机字节顺序 地止和如何处理它们 现在我们很幸运,因为我们有很多的函数来方便地操作地址。没有必要用手工计算它们,也没有必要用 操作来储存成长整字型。首先,假设你凵经有了一个 结构体,你有一个地址 要 储存在其中,你就要用到函数 将地址从点数格式转换成无符号长整型。使用方法如下 注意, 返回的地址己经是网络字节格式,所以你无需再调用函数 我们现在发现上面的代码片断不是十分亢整的,因为它没有错误检查。显而易见,当 发生错误时返 回。记住这些二进制数字?无符号数仅仅和地址 相符合!这可是广播地址!大错特错! 记住要先进行错误检查。 好了,现在你可以将地址转换成长整型了。有没有其相反的方法呢?它可以将一个结构体输出成点数 格式?这样的话,你就要用到函数 的含义是 就像这样: 它将输出地址。需要注意的是 将结构体作为一个参数,不是长整形。同样需要注意的是它 返回的是一个指向一个字符的指针。它是一个由 控制的静态的固定的指针,所以每次调用 ,它就将覆盖上次调用时所得的地址。例如: 这是 这是 输出如下: 假如你需要保存这个地址,使用 函数米指向你自己的字符指针。 上面就是关于这个主题的介绍。稍后,你将学习将一个类似 的字符串转换成它所对应的地 址查阋域名服务稍后。 响数 我想我不能再不提这个了一下面我将讨论一下系统调用。 下面是详细介绍: 但是它们的参数是什么首先, 应该设置成 ,就象上面的数据结构 中 样。然后,参数 告诉内核是 类型还是 类型。最后,把 设 置为。注意:有很多种 我不可能一一列出了,请看 的帮助。当然,还有一 个更好的方式去得到 。同请查阅 的帮助 只是返回你以后在系统调用种可能用到的 描述符,或者在错误的时候返回。仝局变量 屮将储存返回的错误值。请参考 帮助 函数 旦你有个套接字,你可能要将套接字和机器上的定的端∏关联起来。如果你想用来侦听 定端口的数据,这是必要一步 告诉你说用命令 。如果你只想用 那么这 个步骤没有必要。但是无论如何,请绻续读下去 这里是系统调用 的大概 是调用 返回的文件描述符。 是指问数据结构 的指针,它保存你的地址 即端口和地址信息 设置为 简单得很不是吗再看看例子: 需要错误检查 这里也有要注意的几件事情。 是网终字节顺序, 也是的。另外要注 意到的事情是因系统的不同,包含的头文件也不尽相同,请查阅木地的 帮助文件 在 主题中最后要说的话是,在处理自己的地址和或端口的时候,有些工作是可以自动处理的。 随机选择一个没有使用的端凵 使用自己的地址 通过将赋给 ,你告诉 自己选择合适的端口。同样,将 设置 为 ,你告诉它自动填上它所运行的机器的地址 如果你一向小心谨慎,那么你可能注意到我没有将 转换为网终字节顺序!这是因为我知道内 部的东西 实际上就是!即使你改变字节的顺序,依然是。但是完美主义者说应该处处 致 或许是呢?你的代码就不能工作了,那么就看下面的代码 随机选择一个没有使用的端口 使用自己的地址 你或许不相信,上面的代码将可以随便移植。我只是想指出,既然你所遇到的程序不会都运行使用的 在错误的时侠依然是返回,并且设置全局错误变量 在你调用 的时候,你要小心的另一件事情是:不要采用小 的端口号。所有小于的端口号都 被系统保留!你可以选择从到的端∏如果它们没有被别的程序使用的话。 你要注意的另外一件小事是:有时候你根本不需要调用它。如果你使用 来和远程机器进行通讯,你 不需要关心你的本地端口号就象你在使用 的时候,你只要简单的调用 就可以了,它会检查 套接字是合绑定端口,如果没有,它会自己绑定一个没有使用的本地端口 程序 现在我们假设你是个程序。你的用户命令你得到套接字的文件描述符。你听从命令调用了 下一步,你的用户告诉你通过端口标准 端口连接到 。你该怎么做呢幸运的是,你正 在阅读 如何连接到远程主机这一章。你可不想让你的用户失望。 系统调用是这样的: 是系统调用 返回的套接字文件描述符。 是保存着目的地端口和地址的数据结构 设置为 想知道得更多吗?让我们米看个例子 日的地址 错误检查 再一次,你应该检查 的返回值它在错误的时侯返回,并设置全局错误变量 同时,你可能看到,我没有调用因为我不在乎本地的端凵号。我只关心我要去那。内核将为我选择 个合适的端口号,而我们所连接的地方也自动地获得这些信息。一切都不用担心。 函数 是换换内容得时候了。假如你不希望与远程的一个地址相连,或者说,仅仅是将它踢开,那你就需要等待 接入请求并且用各种方法处理它们。处理过程分两步:首先,你听 然后,你接受 请看下面 的内容。 除了要一点解释外,系统调用 也相当简单 是调用 返回的套接字文件描述符。 是在进入队列中允许的连接数日。什么意思呢进 入的连接是在队列中一直等待直到你接受 请看下面的文章连接。它们的数目限制于队列的允许。大 多数系统的允许数目是,你也可以设置为到 和别的函数一样,在发生错误的时候返回,并设置全局错误变量 你可能想象到了,在你调用 前你或者要调用 或者让内核随便选择个端∏。如果你想侦听进 入的连接,那么系统调用的顺序可能是这样的 应该在这 因为它相当的明了,我将在这里不给出例子了。在 那一章的代码将更加完仝。真正麻烦的部分在 数 准备好了,系统调用 会有点古怪的地方的!你可以想象发生这样的事情:有人从很远的地方通 过一个你在恢听 的端口连接 到你的机器。它的迕接将加入到等待接受 的队列 中。你调用 告诉它你冇空闲的连接。它将返回一个新的套接字文件描述符!这样你就有两个套接字 了,原来的一个还在侦听你的那个端口,新的在准备发送 和接收 数据。这就是这个过程! 函数是这样定义的: 相当简单,是和 样的套接字描述符。是个指向局部的数据结构 的指针。 这是要求接入的信息所要去的地方(你叫以测定那个地址在那个端口呼叫你)。在它的地址传递给 之 前 是个局部的整形变量,设置为 将不会将多余的字节给。如 果你放入的少些,那么它会通过改 变 的值反映出来 同样,在错误时返冋,并设置全局错误变量 现在是你应该熟悉的代码片段 用户接入端口 多少等待连接控制 地址信息 错误检查 注意,在系统调用 和 中你应该使用新的套接字描述符 。如果你只想让一个连接进来,那 么你可以使用去关闭原来的文件描述符来避免同个端口更多的连接。 函数 这两个函数用于流式套接字或者数据报套接字的通讯。如果你喜欢使用无连接的数据报套接字,你应该看 看下面关于和 的章节。 是这样的: 是你想发送数据的套接字描述符或者是调用 或者是 返回的。是指向你想发送的 数据的指针。是数据的长度。把 改置为就可以了。详细的资料请看 的 这里是一些可能的例子: 返回实际发送的数据的字节数它可能小于你要求发送的数口!注意,有时候你告诉它要发送一堆数 据可是亡不能处理成功。它只是发送它可能发送的数据,然后希望你能够发送其它的数据。记住,如果 返回的数据和不匹配,你就应该发送其它的数据。但是这里也有个好消息:如果你要发送的包很小小于 大约 它可能处理让数据一次发送完。最后要说得就是,它在错误的时候返回,并设置 题数很相似: 是要读的套接字措述符。是要读的信息的缓冲。是缓冲的最大长度 可以设置为。请参 考 的 返回实际读入缓冲的数据的字节数。或者在错误的时候返叫,同时设置 很简单,不是吗你现在可以在流式套接字上发送数据和接收数据了。你现在是网终程序员了! 和 函数 这很不错啊,你说,但是你还没冇讲无连接数据报套接字呢?没问题,现在我们开始这个内容。 既然数据报套接字不是连接到远程主机的,那么在我们发送个包之前需要什么信息呢不错,是目标地址! 看看下面的 你已经看到了,除了另外的两个信息外,其余的和函数 是一样的。是个指向数据结构 的指针,它包含了目的地的地址和端凵信息。可以简单地设置为 。和函数 类似 返回实际发送的字节数它也可能小于你想要发送的字节数!,或者在错误的时候返回。 相似的还有函数 和 的定义是这样的 又一次,除了两个增加的参数外,这个函数和也是一样的。是一个指向局部数据结构 的指针,它的内容是源机器的地址和端山信息。 是个型的局部指针,它的初始值为 函数调用返回后, 休存着实际储存在中的地址的长度 返回收到的字节长度,或者在发生错误后返冋。 记住,如果你用 连接·个数据报套接字,你可以简单的调用 和 来满足你的要求。这 个时候依然是数据报套接字,依然使用 系统套接字接口会为你自动加上了日标和源的信息。 和 函数 你已经整天都在发送 和接收 数据了,现在你准备关闭你的套接字描述符了。这很简单, 你可以使用般的 文件描述符的 函数: 它将防止套接字上更多的数据的读写。任何在另一端读写套接字的企图都将返回错误信息。 如果你想在如何关闭套接字上有多一点的控制,你可以使用函数 。它允许你将一定方向上的通讯或 者双向的通讯就象 样关闭,你可以使用 是你想要关闭的套接字文件描述复。的值是下面的其中之 不允许接受 不允许发送 不允许发送和接受和 样 成功时返回,失败时返回同时设置如果在无连接的数据报套接字中使用 那么只不过是让 不能使用记住你在数据报套接字中使用了 后是可以使用它们的。 断数 这个函数太简单了。 它太简单了,以至我都不想单列一章。但是我还是这样做了。函数 告诉你在连接的流式套接字 上谁在另外一边。函数是这样的 是连接的流式套接字的描述符。是一个指向结构 或者是 的指 针,它保存着连接的另一边的信息 是一个型的指针,它初始化为 函数 在错误的时候返回,设置相应的 日你获得它们的地址,你可以使用 或者 来打印或者获得更多的信息。但是你不 能得到它的帐号。如果它运行着愚蠢的守护进程,这是可能的,但是它的讨论凵经超出了木文的范围,请参考 以获得更多的信息。 函数 甚至比 还简单的函数是 。它返冋你程序所运行的机器的主机名字。然后你可 以使用 以获得你的机器的地址。 下面是定义 参数很简单 是一个字符数组指针,它将在函数返回时保存 主机名。是 数组的字节长度。 函数调用成功时返回,失败时返回,并设置 域名服务( 如果你不知道的意思,那么我告诉你,它代表域名服务 。它主要的功能是 你给它一个容易记忆的某站点的地址,它给你地址然后你就可以使用 或者其它 函数。当个人输入: 能知道它将连接 到 但是这是如何工怍的呢你可以调用函数 很明白的是,它返回一个指向 的指针。这个数据结构是这样的: 这里是这个数据结构的详绀资料: 地址的正式名称。 空字节地址的倾备名称的指针。 地址类型通常是 地址的比特长度。 零字节主机网终地址指针。网络字节顺序。 中的第一地址。 成功时返回一个指向结构体 的指针,或者是个空 指针。但是和以前不同 不设置 设置错误信息。请看下面的 但是如何使用呢有时候(我们可以从电脑手册中发现),向读者灌输信息是不够的。这个函数可不象它看上 去那么难用 这里是个例子 检查命令行

...展开详情
试读 21P 新编C语言SOCKET编程指南.pdf
立即下载
限时抽奖 低至0.43元/次
身份认证后 购VIP低至7折
一个资源只可评论一次,评论内容不能少于5个字
您会向同学/朋友/同事推荐我们的CSDN下载吗?
谢谢参与!您的真实评价是我们改进的动力~
  • 分享精英

关注 私信
上传资源赚钱or赚积分
最新推荐
新编C语言SOCKET编程指南.pdf 9积分/C币 立即下载
1/21
新编C语言SOCKET编程指南.pdf第1页
新编C语言SOCKET编程指南.pdf第2页
新编C语言SOCKET编程指南.pdf第3页
新编C语言SOCKET编程指南.pdf第4页
新编C语言SOCKET编程指南.pdf第5页

试读结束, 可继续读2页

9积分/C币 立即下载