预览加载中,请您耐心等待几秒...
1/10
2/10
3/10
4/10
5/10
6/10
7/10
8/10
9/10
10/10

亲,该文档总共56页,到这已经超出免费预览范围,如果喜欢就直接下载吧~

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

平台和编译器这篇文档中的大多数代码都在Linux平台PC上用GNU的gcc成功编译过。而且它们在HPUX平台上用gcc也成功编译过。但是注意,并不是每个代码片段都独立测试过。目录:1)什么是套接字?2)Internet套接字的两种类型3)网络理论4)结构体5)本机转换IP地址和如何处理它们socket。函数bind。函数connect。函数listen。函数accept。函数send。和recv()函数sendto()和recvfrom。函数close。和shutdown。函数sin_addr按照网络字节顺序呢?”要知道这个问题的答案,我们就要仔细的看一看这个数据结构:structin_addr,有这样一个联合(unions):/*Internet地址(一个与历史有关的结构)*/structin_addr{unsignedlongs_addr;);它曾经是个最坏的联合,但是现在那些日子过去了。如果你声明”ina"是数据结构structsockaddr_in的实例,那么MH就储存4字节的IP地址(使用网络字节顺序)。如果你不幸的系统使用的还是恐怖的联合structin_addr,你还是可以放心4字节的IP地址并且和上面我说的一样(这是因为使用了“#define”。)本机转换我们现在到了新的章节。我们曾经讲了很多网络到本机字节顺序的转换,现在可以实践了!你能够转换两种类型:short(两个字节)和long(四个字节)。这个函数对于变量类型unsigned也适用。假设你想将short从本机字节顺序转换为网络字节顺序。用表示“本机(host)",接着是"to",然后用"n"表zj\"网络(network)",最后用"s"表示"short":h-to-n-s,或者htons()("HosttoNetworkShort")o太简单了…如果不是太傻的话,你一定想到了由“n”,nhM,V,和“1”形成的正确组合,例如这里肯定没有stolh()("ShorttoLongHost")函数,不仅在这里没有,所有场合都没有。但是这里有:htons()—HHosttoNetworkShort1'htonl()—"HosttoNetworkLong"ntohs()—uNetworktoHostShort"ntohlO-^NetworktoHostLong,1现在,你可能想你已经知道它们了。你也可能想:“如果我想改变char的顺序要怎么办呢?”但是你也许马上就想到,“用不着考虑的”。你也许会想到:我的68000机器已经使用了网络字节顺序,我没有必要去调用htonl()转换IP地址。你可能是对的,但是当你移植你的程序到别的机器上的时候,你的程序将失败。可移植性!这里是Unix世界!记住:在你将数据放到网络上的时候,确信它们是网络字节顺序的。最后一点:为什么在数据结构structsockaddr_in中,sin_addr和sin_port需要转换为网络字节顺序,而sin_family需不需要呢?答案是:sin_addr和sin_port分别封装在包的IP和UDP层。因此,它们必须要是网络字节顺序。但是sin_family域只是被内核(kernel)使用来决定在数据结构中包含什么类型的地址,所以它必须是本机字节顺序。同时,sin_family没有发送到网络上,它们可以是本机字节顺序。IP地址和如何处理它们现在我们很幸运,因为我们有很多的函数来方便地操作IP地址。没有必要用手工计算它们,也没有必要用操作来储存成长整字型。首先,假设你已经有了一个sockaddjin结构体ina,你有一个IP地址”132.241510”要储存在其中,你就要用到函数inet_addr(),将IP地址从点数格式转换成无符号长整型。使用方法如下:ina.sin_addr.s_addr二inet_addr(n132.241.5.10°);注意,inet_addr()返回的地址已经是网络字节格式,所以你无需再调用函数htonl()。我们现在发现上面的代码片断不是十分完整的,因为它没有错误检查。显而易见,当inet_addr()发生错误时返回记住这些二进制数字?(无符号数)-1仅仅和IP地址相符合!这可是广播地址!大错特错!记住要先进行错误检查。好了,现在你可以将IP地址转换成长整型了。有没有其相反的方法呢?它可以将一个in_addr结构体输出成点数格式?这样的话,你就要用到函数inet_ntoa()(“ntoa”的含义是“networktoascii'*),就像这样:printf(,'%s',,inet_ntoa(ina.sin_addr));它将输出IP地址。需要注意的是inet_ntoa()将结构体in-addr作为一个参数,不是长整形。同样需要注意的是它返回的是一个指向一个字符的指针。它