1、本次实验要求完成以下内容:要求:1 将上面程序用 vi 录入并编译运行,老师查看运行结果。2 为程序加注释,重点解释输出结果的含义,写在活页纸上 下课前上交;重点提示:上交材料雷同者,全部作废,视为没有完成实验。一、运行结果二、程序注释Main()int i; /定义一个名为 i 的整形变量struct sockaddr_in server; /定义一个名为 server 的 sockaddr_in 类型的结构体bzero( /为网际套接字地址结构 server 设置初始值 0printf(“Your servers ip init mem is n”); /输出 Your servers i
2、p init mem is 字符串并换行for(i=0;isizeof(server);i+) /以十六进制形式输出套接字地址结构 server 的初始值Printf(“ %02x”,*(unsigned char*)(printf(“n ”);server.sin_family=AF_INET;server.sin_port=htons(PORT);server.sin_addr.s_addr=inet_addr(“127.0.0.1”); /以上三行为套接字地址结构中的成员赋值,客户端要建立连接的服务器 IP 地址为127.0.0.1,端口号为 1234printf(“Your serve
3、rs ip sin_family is %dn”,server.sin_family); /以整数形式输出网际套接字地址结构中 sin_family 成员的值printf(“Your servers ip is %s,portis %dn”,inet_ntoa(server.sin_addr),htons(server.sin_port); /以字符串的形式输出网际套接字地址结构中 sin_addr 成员的值,以整数形式输出网际套接字地址结构中 sin_port 成员的值printf(“Your servers length is %dn”,sizeof(server); /以整数形式输出该套
4、接字地址结构的大小printf(“Your servers ip mem is n ”); /输出 Your servers ip mem is 字符串并换行for(i=0;isizeof(server);i+) /以十六进制形式输出网际套接字地址结构 server 的值printf(“ %02x ”,*(unsigned char*)(return;三、输出结果解释第一行结果:执行 printf(“Your servers ip init mem is n”);之后,printf 函数输出字符串 Your servers ip init mem is 并换行第二行结果:本行结果为网际套接字地
5、址结构 server 设置初始值 0 之后的结果;此次结果显示为 32 个零,其中 sin_family 成员的值,占 2 个字节,对应为 00 00; sin_port 成员的值,占 2 个字节,对应为 00 00; sin_family 成员的值,占 4 个字节,对应为 00 00 00 00;最后十六个零为 sin_zero 成员的值,占 8 个字节,对应为 00 00 00 00 00 00 00 00。其中网际套接字地址结构体中共包含 5 个成员,sin_len 是长度成员,占一个字节,存储套接字地址结构的长度,但不是所有系统都支持,有了它可以简化变长套接字地址结构的处理。一般情况下
6、不需要设置它和检查它,除非涉及到路由套接字,本处并没有涉及到路由套接字所以只有 32 个零,否则可能是 34 个零。bzero 函数的原型是 extern void bzero(void *s,int n),其中 s 为要置零的数据的起始地址,n为要置零的数据的字节个数,函数功能是将 s 所指的内存区域前 n 个字节置为 0,且包括0。在执行过 bzero 函数之后,将 server 所指的内存区域中的字节全部置为 0,故输出后的结果全部为 0。第三行结果:本行结果为网际套接字地址结构中的成员 sin_family 的 AF_INET 的默认值 2sin_family 是 Internet 地
7、址族,在 IPv4 中是 AF_INET,其默认值为 2。Winsock2.h 中#define AF_INET 2 / internetwork: UDP, TCP, etc.第四行结果:本行结果为网际套接字地址结构中的成员 ip 地址的值和端口号的值。inet_ntoa 函数的作用是将网际套接字地质结构中存储的 32 位的网络字节序的二进制 IP 地址转换成人们通用的点分十进制的 IP 地址并输出为 127.0.0.1其中,127.0.0.1 转换为 32 位的网络字节序的二进制 IP 地址为:1111111.00000000.00000000.0000000132 位的网络字节序的二进制
8、 IP 地址转换为点分十进制的 IP 地址为:127.0.0.1PORT 在程序的开头被声明为默认值 1234,并在 server.sin_port=htons(PORT)语句中被转换成网络字节序给 sin_port 赋值。htons 函数的作用是将 16 位的短整型数从主机字节序转换成网络字节序并以整形形式输出为 1234第五行结果:本行结果为网际套接字地址结构 server 的大小 16 个字节sockaddr_in 结构体中包含 5 个成员,其中 sin_len 是长度成员,存储套接字地址结构的长度,但不是所有系统都支持,一般情况下不需要设置它和检查它,除非涉及到路由套接字。本程序并没有
9、设置这个成员,所以只有 16 个字节。其中 sin_family 成员的值,占 2 个字节, sin_port 成员的值,占 2 个字节, sin_family 成员的值,占 4 个字节, sin_zero 成员的值,占 8 个字节,共 16 个字节。第六行结果:执行 printf(“Your servers ip mem is n”);之后,printf 函数输出字符串 Your servers ip mem is 并换行第七行结果:本行结果输出为 02 00 04 d2 7f 00 00 01 00 00 00 00 00 00 00 00共 16 个字节,以十六进制形式输出,其中 02 00 这两个字节表示的是成员 sin_family 的值,以小端方式存储,在以上的结果输出中,以十进制形式输出的结果为 2,而在内存中,其值占两个字节,所以空出的部分补零;04 d2 这两个字节表示的是成员 sin_port 的值,对应的十进制值为 1234;7f 00 00 01 这四个字节表示的是成员 sin_family 的值,占四个字节,对应的点分十进制是127.0.0.1,;最后的八个字节全部置为 0,暂时没有被使用,总是将它置为 0。