第一范文网 - 专业文章范例文档资料分享平台

c语言socket编程

来源:用户分享 时间:2025/11/15 15:25:53 本文由loading 分享 下载这篇文档手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:xxxxxxx或QQ:xxxxxx 处理(尽可能给您提供完整文档),感谢您的支持与谅解。

现在,你可能看到这些层次如何协调来封装原始的数据了。

看看建立一个简单的数据包有多少工作?哎呀,你将不得不使用 \来建立数据包头!这仅仅是个玩笑。对于流式套接字你要作的是 send() 发送数据。对于数据报式套接字,你按照你选择的方式封装数据然后使用 sendto()。内核将为你建立传输层和 Internet 层,硬件完成网络访问层。 这就是现代科技。 现在结束我们的网络理论速成班。哦,忘记告诉你关于路由的事情了。 但是我不准备谈它,如果你真的关心,那么参考 IP RFC。

-------------------------------------------------------------------------------- 结构体

终于谈到编程了。在这章,我将谈到被套接字用到的各种数据类型。 因为它们中的一些内容很重要了。

首先是简单的一个:socket描述符。它是下面的类型: int

仅仅是一个常见的 int。

从现在起,事情变得不可思议了,而你所需做的就是继续看下去。注 意这样的事实:有两种字节排列顺序:重要的字节 (有时叫 \,即八位位组) 在前面,或者不重要的字节在前面。前一种叫“网络字节顺序 (Network Byte Order)”。有些机器在内部是按照这个顺序储存数据,而另外 一些则不然。当我说某数据必须按照 NBO 顺序,那么你要调用函数(例如 htons() )来将它从本机字节顺序 (Host Byte Order) 转换过来。如果我没有 提到 NBO, 那么就让它保持本机字节顺序。

我的第一个结构(在这个技术手册TM中)--struct sockaddr.。这个结构 为许多类型的套接字储存套接字地址信息: struct sockaddr {

unsigned short sa_family; /* 地址家族, AF_xxx */ char sa_data[14]; /*14字节协议地址*/ };

sa_family 能够是各种各样的类型,但是在这篇文章中都是 \。 sa_data

包含套接字中的目标地址和端口信息。这好像有点 不明智。

为了处理struct sockaddr,程序员创造了一个并列的结构: struct sockaddr_in (\代表 \。) struct sockaddr_in {

short int sin_family; /* 通信类型 */ unsigned short int sin_port; /* 端口 */ struct in_addr sin_addr; /* Internet 地址 */

unsigned char sin_zero[8]; /* 与sockaddr结构的长度相同*/ };

用这个数据结构可以轻松处理套接字地址的基本元素。注意 sin_zero (它被加入到这个结构,并且长度和 struct sockaddr 一样) 应该使用函数 bzero() 或 memset() 来全部置零。 同时,这一重要的字节,一个指向 sockaddr_in结构体的指针也可以被指向结构体sockaddr并且代替它。这 样的话即使 socket() 想要的是 struct sockaddr *,你仍然可以使用 struct sockaddr_in,并且在最后转换。同时,注意 sin_family 和 struct sockaddr 中的 sa_family 一致并能够设置为 \。最后,sin_port和 sin_addr 必须是网络字节顺序 (Network Byte Order)!

你也许会反对道:\但是,怎么让整个数据结构 struct in_addr sin_addr 按照网络字节顺序呢?\要知道这个问题的答案,我们就要仔细的看一看这 个数据结构: struct in_addr, 有这样一个联合 (unions): /* Internet 地址 (一个与历史有关的结构) */ struct in_addr { unsigned long s_addr; };

它曾经是个最坏的联合,但是现在那些日子过去了。如果你声明 \是数据结构 struct sockaddr_in 的实例,那么 \就储 存4字节的 IP 地址(使用网络字节顺序)。如果你不幸的系统使用的还是恐 怖的联合 struct in_addr ,你还是可以放心4字节的 IP 地址并且和上面 我说的一样(这是因为使用了“#define”。)

--------------------------------------------------------------------------------

本机转换

我们现在到了新的章节。我们曾经讲了很多网络到本机字节顺序的转 换,现在可以实践了!

你能够转换两种类型: short (两个字节)和 long (四个字节)。这个函 数对于变量类型 unsigned 也适用。假设你想将 short 从本机字节顺序转 换为网络字节顺序。用 \表示 \本机 (host)\,接着是 \,然后用 \表 示 \网络 (network)\,最后用 \表示 \: h-to-n-s, 或者 htons() (\Short\。 太简单了...

如果不是太傻的话,你一定想到了由\,\,\,和 \形成的正确 组合,例如这里肯定没有stolh() (\函数,不仅在这里 没有,所有场合都没有。但是这里有: htons()--\ htonl()--\ ntohs()--\ ntohl()--\

现在,你可能想你已经知道它们了。你也可能想:“如果我想改变 char 的顺序要怎么办呢?” 但是你也许马上就想到,“用不着考虑的”。你也许会想到:我的 68000 机器已经使用了网络字节顺序,我没有必要去调用 htonl() 转换 IP 地址。你可能是对的,但是当你移植你的程序到别的机器 上的时候,你的程序将失败。可移植性!这里是 Unix 世界!记住:在你将数据放到网络上的时候,确信它们是网络字节顺序的。

最后一点:为什么在数据结构 struct sockaddr_in 中, sin_addr 和 sin_port 需要转换为网络字节顺序,而sin_family 需不需要呢? 答案是: sin_addr 和 sin_port 分别封装在包的 IP 和 UDP 层。因此,它们必须要 是网络字节顺序。但是 sin_family 域只是被内核 (kernel) 使用来决定在数 据结构中包含什么类型的地址,所以它必须是本机字节顺序。同时, sin_family 没有发送到网络上,它们可以是本机字节顺序。

--------------------------------------------------------------------------------

IP 地址和如何处理它们

现在我们很幸运,因为我们有很多的函数来方便地操作 IP 地址。没有必要用手工计算它们,也没有必要用\操作来储存成长整字型。首先,假设你已经有了一个sockaddr_in结构体ina,你有一个IP地址\要储存在其中,你就要用到函数inet_addr(),将IP地址从 点数格式转换成无符号长整型。使用方法如下:

ina.sin_addr.s_addr = inet_addr(\

注意,inet_addr()返回的地址已经是网络字节格式,所以你无需再调用 函数htonl()。

我们现在发现上面的代码片断不是十分完整的,因为它没有错误检查。 显而易见,当inet_addr()发生错误时返回-1。记住这些二进制数字?(无符号数)-1仅仅和IP地址255.255.255.255相符合!这可是广播地址!大错特 错!记住要先进行错误检查。

好了,现在你可以将IP地址转换成长整型了。有没有其相反的方法呢? 它可以将一个in_addr结构体输出成点数格式?这样的话,你就要用到函数 inet_ntoa()(\的含义是\,就像这样: printf(\

它将输出IP地址。需要注意的是inet_ntoa()将结构体in-addr作为一个参数,不是长整形。同样需要注意的是它返回的是一个指向一个字符的 指针。它是一个由inet_ntoa()控制的静态的固定的指针,所以每次调用 inet_ntoa(),它就将覆盖上次调用时所得的IP地址。例如: char *a1, *a2; . .

a1 = inet_ntoa(ina1.sin_addr); /* 这是198.92.129.1 */ a2 = inet_ntoa(ina2.sin_addr); /* 这是132.241.5.10 */ printf(\ printf(\ 输出如下:

address 1: 132.241.5.10

搜索更多关于: c语言socket编程 的文档
c语言socket编程.doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.diyifanwen.net/c8ylvl5mv2x4yj374r8rs_2.html(转载请注明文章来源)
热门推荐
Copyright © 2012-2023 第一范文网 版权所有 免责声明 | 联系我们
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:xxxxxx 邮箱:xxxxxx@qq.com
渝ICP备2023013149号
Top