资源预览内容
第1页 / 共38页
第2页 / 共38页
第3页 / 共38页
第4页 / 共38页
第5页 / 共38页
第6页 / 共38页
第7页 / 共38页
第8页 / 共38页
第9页 / 共38页
第10页 / 共38页
亲,该文档总共38页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
第15讲 网络编程,演讲人:马玉军 e-mail:,课程安排,网络编程的基本概念 套接字 域名与IP地址 网络协议与网络服务 网络地址的转换 网络编程中的错误处理,网络编程的基本概念,在学习网络编程之前,需要理解一些关于网络的概念和术语。 IP地址的作用是标识网络中的一台计算机,每一台计算机都有一个IP地址。在程序中通过IP地址来访问一台计算机。本小节将讲述IP地址的一些知识。IP地址是用来标识全球计算机地址的一种符号,相当于一个手机的号码。使用这个地址可以访问一台计算机。作为计算机的统一标识,IP地址有以下特点。 IP地址具有统一的格式。IP地址是32位长度的二进制数值,存储空间是4个字节。这4个字符的二进制字符值可以表示一台计算机。 IP地址可以使用点分十进制来表示。二进制的数值是不便于记忆的,可以把每个字节用一个整数来表示。例如11000000 10101000 00000001 00000110是一台计算机的IP地址。转换成点分十进制后是192.168.1.1。 在同一个网络中,IP地址是唯一的。因为需要根据IP地址来访问一台计算机,所以在可以访问的范围以内,每一台计算机的IP地址是唯一的。,网络编程的基本概念,在终端中输入下面的命令,可以查看自己计算机的IP信息。 ifconfig 终端中显示的IP信息与网卡信息如下所示。 eth0 Link encap:Ethernet HWaddr 00:0F:EA:45:4E:51 inet addr:192.168.1.100 Bcast:192.168.1.255 Mask:255.255.255.0 inet6 addr: fe80:20f:eaff:fe45:4e51/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:6332 errors:0 dropped:0 overruns:0 frame:0 TX packets:4484 errors:0 dropped:0 overruns:0 carrier:0 collisions:56 txqueuelen:1000 RX bytes:6710445 (6.3 MiB) TX bytes:531858 (519.3 KiB) Interrupt:18 提示:IP地址又称为逻辑地址,可以通过软件设置于改变主机的IP地址;MAC地址又称为物理地址,固化在网卡上,通常不能改变网卡的MAC地址。,网络编程的基本概念,端口:所谓端口,是计算机中为了标识计算机中访问网络的不同程序的编号。每一个程序在访问网络时,都会分配一个标识符。程序在访问网络或接受访问时,会用这个标识符表示这一网络数据属于这个程序。这里的端口并非网卡接线的端口,而是对不同程序的逻辑编号,并不是实际存在的。 端口号是一个16位的无符号整数,对应的十进制取值范围是065535。不同编号范围的端口有不同的作用。低于256的端口是系统保留端口号,主要用于系统进程通信。例如网站的WWW服务使用的是80号端口,FTP服务使用的是21号端口。不在这一范围的端口号是自由端口号,在编程时可以调用这些端口号。 提示:端口号(Port)用于区分网络通信中主机上不同的网络应用程序。,网络编程的基本概念,域名:域名是用来代替IP地址来标识计算机的一种直观名称。例如百度网站的IP地址是202.108.22.43,这个IP地址没有任何逻辑含义,不便于记忆。而是一个便于记忆的名称,用于代替这个IP地址。在访问计算机时,可以用这个域名来代替IP地址。 在C语言编程时,有时需要用域名来访问一个计算机。这些要将域名转换成相应的IP地址。在终端中,可以用ping命令来查看一个域名所对应的IP地址。例如可以输入下面的命令来查看百度的IP地址。 ping 终端中显示的结果如下所示。表明百度的IP地址是202.108.22.43。 PING (202.108.22.43) 56(84) bytes of data. 64 bytes from xd-22-43- (202.108.22.43): icmp_seq=2 ttl=58 time=33.9 ms,网络编程的基本概念,TCP与UDP:TCP与UDP是两种不同的网络传输方式。两个不同计算机中的程序,使用IP地址和端口,要使用一种约定的方法进行数据传输。TCP与UDP就是网络中的两种数据传输约定,主要的区别是进行数据传输时是否进行连接。 TCP:TCP是一种面向连接的网络传输方式。这种方式可以理解为打电话。计算机A先呼叫计算机B。计算机B接受连接后发出确认信息。计算机A收到确认信息以后发送信息。计算机B完成数据接收以后发送完毕信息。这时再关闭数据连接。所以TCP是面向连接的可靠的信息传输方式。这种方式是可靠的,缺点是传输过程复杂,需要占用较多的网络资源。 UDP:UDP是一种面向无连接的传输方式。可以简单理解成邮寄信件。将信件封装放入邮筒以后,不再参与邮件的传送过程。使用UDP传送信息时,不建立连接,直接把信息发送到网络上,由网络完成信息的传送。信息传递完成以后也不发送确认信息。这种传输方式是不可靠的,但是有很好的传输效率。对传输可靠性要求不高时,可以选择使用这种传输方式。 注意:如果使用UDP协议进行数据通信,数据传输的可靠性由软件开发人员编程实现。,套接字,套接字(Socket)的本义是插座,在网络中用来描述计算机中不同程序与其它计算机程序的通信方式。本节将讲述套接字的含义与数据类型。 什么是套接字:程序访问网络进行数据通信时,TCP和UDP会遇到同时为多个应用程序同时并发进行通信的问题。多个TCP连接或多个应用程序进程可能需要通过同一个 TCP协议端口传输数据。为了区别不同的应用程序的进程和连接,需要使用应用程序与TCPIP协议交互的套接字(Socket)的接口。 区分不同应用程序进程间的网络通信和连接,主要使用3个参数。通信的目的IP地址、使用的传输层协议(TCP或UDP)和使用的端口号。在编程时,就是使用为三个参数来构成一个套接字。这个套接字相当于一个接口,可以进行不同计算机程序的信息传输。 提示:套接字=传输层协议+端口号+IP地址。,套接字,套接字相关的数据类型:C程序进行套接字编程时,常会使用到sockaddr数据类型或sockaddr_in数据类型。这两种数据类型是系统中定义的结构体,用于保存套接字的信息。 sockaddr用来保存一个套接字,定义方式如下所示。 01struct sockaddr 02 03 unsigned short int sa_family; 04 char sa_data14; 05; 在这个结构体中,成员的含义如下所示。 sa_family:指定通信的地址类型。如果是TCP/IP通信,则该值为AF_INET。 sa_data:最多使用14个字符长度,用来保存IP地址和端口信息。 sockaddr_in的功能与soockaddr相同,也是用来保存一个套接字的信息。不同的是将IP地址与端口分开为不同的成员。这个结构体的定义方法如下所示。 01struct socketaddr_in 02 03 unsigned short int sin_family; 04 uint16_t sin_port; 05 struct in_addr sin_addr; 06 unsigned char sin_zero8; 07;,套接字,这个结构体的成员与作用如下所示。 sin_family:与sockaddr结构体中的sa_family相同。 sin_port:套接字使用的端口号。 sin_addr:需要访问的IP地址。 sin_zero:未使用的字段,填充为0。 在这一结构体中,in_addr也是一个结构体,定义方法如下所示。作用是保存一个IP地址。 01struct in_addr 02 03 uint32_t s_addr; 04; 提示:这两个套接字结构体的保存内容是相同的。可以用数据类型转换的方法来转换这两个类型的变量。,套接字,套接字类型:套接字类型指的是在网络通信中不同的数据传输方式。例如UDP和TCP就是两种不同的套接字类型。常用的套接字类型有下面3种。 流套接字(SOCK_STREAM):流套接字使用了面向连接的可靠的数据通信方式,即TCP(The Transmission Control Protocol)协议。这种服务可以实现无差错、无重复发送、并按顺序接收。 数据报套接字(Raw Sockets):数据报套接字使用了面向无连接的数据传输方式,即UDP(User Datagram Protocol)协议。这种协议在数据发送出去以后,即完成通信的任务。然后,完全依靠网络来完成数据传输。网络不能完全保证数据正确传输,也不能保证数据按顺序接收。这种套接字不能保证数据传输的可靠性,可能在通信中出现数据丢失的情况,需要在程序中作出相应的处理。 原始套接字(SOCK_RAW):前面讲述的两种套接字是系统定义的,所有的信息都需要按照这种方式进行封装。原始套接字是没有经过处理的IP数据包,可以根据自己程序的要求进行封装。如果要访问其它的协议,需要使用原始套接字来构造相应的协议。,域名与IP地址,在网络编程时,知道域名是不能直接访问一个主机的,需要转换成相应的IP地址。有时在程序中需要将一个IP地址转换成一个域名。本节将讲解C程序中的IP地址与域名的转换问题。 提示:在TCP/IP网络中,通信双方的主机必须知道彼此的IP地址方可进行正常的通信,如果给出的主机的域名,在开始正常的通信前必须把域名转换为IP地址。这个域名到IP地址的转换过程称为域名解析。 用域名取得主机的IP地址:域名是为了便于记忆,来代替IP地址访问网络的方法。在使用域名访问网络时,需要将这个域名转换成相对应的IP地址。用域名返回地址的函数是gethostbyname。这个函数的使用方法如下所示。 01struct hostent *gethostbyname(const char *name); 在参数列表中,name是一个表示域名的字符串。函数会把这个域名转换成一个主机地址结构体返回。结构体hostent的定义方法如下所示。 01struct hostent 02 03 char *h_name; 04 char *h_aliases; 05 int h_addrtype; 06 int h_length; 07 char *h_addr_list; 08,域名与IP地址,这个结构体成员含义如下所示。 h_name:正式的主机名称。 h_aliases:这个主机的别名。 h_addrtype:主机名的类型。 h_length:地址的长度。 addr_list:从域名服务器取得的主机的地址。 在解析域名时,可能没有这个域名或域名服务器发生错误。可能返回的错误信息如下所示。可以用error来捕获错误编号。 HOST_NOT_FOUND:主机没有找到。 NO_ADDRESS or NO_DATA:没有IP地址或没有数据。 NO_RECOVERY:域名服务器发生错误。 TRY_AGAIN:请稍候再重试。 下面的实例,是解析域名的IP地址,并且显示出相关信息。,域名与IP地址,域名与IP地址,用IP地址返回域名:用一个IP地址可以查询到这个IP的域名,需要使用的函数是gethostbyaddr。这个函数的使用方法如下所示。 01struct hostent *gethostbyaddr(const void *addr, socklen_t len, int type); 在参数列表中,addr是一个保存了IP地址的字符串。len是这个IP地址的长度。type的值一般为AF_INET。函数的返回值是hostent类型的指针。这一指针的定义和上一节的相同。如果转换失败,则返回null指针。下面的实例,是
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号