TCP-IP+Socket网络编程.ppt
《TCP-IP+Socket网络编程.ppt》由会员分享,可在线阅读,更多相关《TCP-IP+Socket网络编程.ppt(85页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、2022-7-24TCP/IP Socket网络编程2内容大纲 Internet与TCP/IP协议 TCP/IP协议体系结构与OSI模型 Socket编程接口 Windows Socket Linux Socket TCP/IP网络程序框架与示例2022-7-24TCP/IP Socket网络编程3Internet与TCP/IP协议第一节Internet与TCP/IP协议2022-7-24TCP/IP Socket网络编程4Internet的历史 Internet“冷战”的产物 1957年10月和11月,前苏联先后有两颗“Sputnik”卫星上天 1958年美国总统艾森豪威尔向美国国会提出建立
2、DARPA (Defense Advanced Research Project Agency),即国防部高级研究计划署,简称ARPA 1968年6月DARPA提出“资源共享计算机网络” (Resource Sharing Computer Networks),目的在于让DARPA的所有电脑互连起来,这个网络就叫做ARPAnet,即“阿帕网”,是Interne的最早雏形2022-7-24TCP/IP Socket网络编程5网络互联促成了TCP/IP协议的产生 早期的ARPAnet使用网络控制协议(Network Control Protocol,NCP),不能互联不同类型的计算机和不同类型的操
3、作系统,没有纠错功能 1973年由Kahn和Vinton Cerf两人合作为ARPAnet开发了新的互联协议。 1974年12月两人正式发表第一份TCP协议详细说明,但此协议有信包丢失时不能得到有效的纠正2022-7-24TCP/IP Socket网络编程6网络互联促成了TCP/IP协议的产生 TCP协议分成了两个不同的协议: 用来检测网络传输中差错的传输控制协议TCP 专门负责对不同网络进行互联的互联网协议IP 从此TCP/IP协议诞生 1983年ARPAnet上停止使用NCP,互联网上的主机全部使用TCP/IP协议,TCP/IP协议成为Internet中的“世界语”2022-7-24TCP
4、/IP Socket网络编程7Internet与TCP/IP协议第二节TCP/IP协议体系结构与OSI模型2022-7-24TCP/IP Socket网络编程8网络的体系结构 网络采用分而治之的方法设计,将网络的功能划分为不同的模块,以分层的形式有机组合在一起。 每层实现不同的功能,其内部实现方法对外部其他层次来说透明,每层向上层提供服务,也可以使用下层提供的服务 网络体系结构即指网络的层次结构和每层所使用协议的集合 两类非常重要的体系结构:OSI与TCP/IP2022-7-24TCP/IP Socket网络编程9OSI开放系统互联模型 OSI模型相关的协议已经很少使用,但模型本身非常通用 共
5、有七层2022-7-24TCP/IP Socket网络编程10TCP/IP协议族的体系结构 TCP/IP协议是Internet事实上的工业标准。 一共有四层2022-7-24TCP/IP Socket网络编程11TCP/IP协议与OSI参考模型的对应关系2022-7-24TCP/IP Socket网络编程12TCP/IP协议通信模型2022-7-24TCP/IP Socket网络编程13数据的封装与传递过程2022-7-24TCP/IP Socket网络编程14一些基本概念 IP地址 端口号 字节序2022-7-24TCP/IP Socket网络编程15IP地址 IP地址是Internet中主
6、机的标识 Internet中的主机要与别的机器通信必须具有一个IP地址 一个IP地址为32位(IPV4),或者128位(IPV6) 每个数据包都必须携带目的IP地址和源IP地址,路由器依靠此信息为数据包选择路由 特殊的IP地址:广播地址、多播地址 表示形式:常用点分形式,如202.38.64.10,最后都会转换为一个32位的整数。 IP地址分级 子网掩码2022-7-24TCP/IP Socket网络编程16端口号 为了区分一台主机接收到的数据包应该递交给哪个进程来进行处理,使用端口号 TCP端口号与UDP端口号独立 端口号一般由IANA (Internet Assigned Numbers
7、Authority) 管理 众所周知端口:11023,1255之间为大部分众所周知端口,2561023端口通常由UNIX占用 注册端口:102449151 动态或私有端口:49151655352022-7-24TCP/IP Socket网络编程17端到端通信数据包投递过程2022-7-24TCP/IP Socket网络编程18一个比喻 如果把IP数据包的投递过程看成是给远方的一位朋友寄一封信,那么 IP地址就是这位朋友的所在位置,如安徽合肥中国科大计算系(依靠此信息进行路由) 端口号就是这位朋友的名字(依靠这个信息最终把这封信交付给这位收信者)2022-7-24TCP/IP Socket网络编
8、程19字节序 大尾端(Big-Endian):字节的高位在内存中放在存储单元的起始位置 小尾端(Little-Endian):与大尾端相反2022-7-24TCP/IP Socket网络编程20字节序 网络字节序(NBO,Network Byte Order) 使用统一的字节顺序,避免兼容性问题 主机字节序(HBO,Host Byte Order) 不同的机器HBO是不一样的,这与CPU的设计有关 Motorola 68K系列,HBO与NBO是一致的 Intel X86系列,HBO与NBO不一致2022-7-24TCP/IP Socket网络编程21Internet与TCP/IP协议第三节So
9、cket编程接口2022-7-24TCP/IP Socket网络编程22内容 Socket简介 Windows Socket Linux Socket Socket常用函数介绍 TCP/IP网络程序框架与实例 通信方式 阻塞 非阻塞2022-7-24TCP/IP Socket网络编程23为什么需要Socket 普通的I/O操作过程 打开文件读/写操作关闭文件 TCP/IP协议被集成到操作系统的内核中,引入了新型的“I/O”操作 进行网络操作的两个进程在不同的机器上,如何连接? 网络协议具有多样性,如何进行统一的操作 需要一种通用的网络编程接口:Socket2022-7-24TCP/IP Soc
10、ket网络编程24什么是Socket 独立于具体协议的网络编程接口 在ISO模型中,主要位于会话层和传输层之间 BSD Socket(伯克利套接字)是通过标准的UNIX文件描述符和其它程序通讯的一个方法,目前已经被广泛移植到各个平台。2022-7-24TCP/IP Socket网络编程25Socket类型 流式套接字(SOCK_STREAM) 提供了一个面向连接、可靠的数据传输服务,数据无差错、无重复的发送且按发送顺序接收。内设置流量控制,避免数据流淹没慢的接收方。数据被看作是字节流,无长度限制。 数据报套接字(SOCK_DGRAM) 提供无连接服务。数据包以独立数据包的形式被发送,不提供无差
11、错保证,数据可能丢失或重复,顺序发送,可能乱序接收。 原始套接字(SOCK_RAW) 可以对较低层次协议,如IP、ICMP直接访问。2022-7-24TCP/IP Socket网络编程26Socket的位置2022-7-24TCP/IP Socket网络编程27两类系统中使用的Socket 不同操作系统中的Socket Windows Socket (Winsock) Linux Socket (BSD Socket)2022-7-24TCP/IP Socket网络编程28Windows Socket 简称Winsock,是在Windows环境下使用的一套网络编程规范,基于4.3BSD的BSD
12、 Socket API制定 1991年Winsock 1.1,16位,由WINSOCK.DLL支持,主要用在Windows 95中 1997年Winsock 2.2 版,32位,由WSOCK32.DLL支持,主要用在Windows 98及以后的版本中 已经成为Windows环境下网络编程的事实标准 三类函数 与BSD Socket相兼容的基本函数 与BSD Socket相兼容的网络信息检索函数 Windows专用扩展函数2022-7-24TCP/IP Socket网络编程29Linux Socket 基本上就是BSD Socket 需要使用的头文件 数据类型:#include 函数定义:#in
13、clude 2022-7-24TCP/IP Socket网络编程30Socket常用函数介绍 基本函数 网络信息检索函数2022-7-24TCP/IP Socket网络编程31基本函数 网络连接函数 socket创建套接字 bind绑定本机端口 connect建立连接 listen监听端口 accept接受连接 recv, recvfrom数据接收 send, sendto数据发送 close, shutdown关闭套接字2022-7-24TCP/IP Socket网络编程32基本函数 转换函数 IP地址转换函数 inet_addr()点分十进制数表示的IP地址转换为网络字节序的IP地址 in
14、et_ntoa()网络字节序的IP地址转换为点分十进制数表示的IP地址 字节排序函数 htonl4字节主机字节序转换为网络字节序 ntohl 4字节网络字节序转换为主机字节序 htons2字节主机字节序转换为网络字节序 ntohs2字节网络字节序转换为主机字节序2022-7-24TCP/IP Socket网络编程33网络信息检索函数 网络信息检索函数 gethostname获得主机名 getpeername获得与套接口相连的远程协议地址 getsockname获得套接口本地协议地址 gethostbyname根据主机名取得主机信息 gethostbyaddr根据主机地址取得主机信息 getpr
15、otobyname根据协议名取得主机协议信息 getprotobynumber根据协议号取得主机协议信息 getservbyname根据服务名取得相关服务信息 getservbyport根据端口号取得相关服务信息 getsockopt/setsockopt获取/设置一个套接口选项 ioctlsocket设置套接口的工作方式2022-7-24TCP/IP Socket网络编程34Windows中的Socket编程 Windows中的Socket编程 Winsock 的启动 Winsock API基本函数 TCP/IP网络程序框架(C/S模式) 阻塞与非阻塞通信方式 实例程序说明2022-7-24
16、TCP/IP Socket网络编程35Winsock Winsock是一个基于Socket模型的API,在Windows系统中广泛使用 它在Berkeley接口函数的基础上,还增加了基于消息驱动机制的Windows扩展函数 Winsock1.1只支持TCP/IP网络,Winsock2.2增加了对更多协议的支持2022-7-24TCP/IP Socket网络编程36Winsock(2) 需要包含头文件Winsock2.h,需要使用库ws2_32.lib,包含办法可以用语句来告诉编译时调用该库#pragma comment(lib,”ws2_32.lib”); 如果使用Visual C+ 6.0,
17、可以通过“工程” “设置”“工程设置”“链接”“对象/库模块”中加入“ws2_32.lib”2022-7-24TCP/IP Socket网络编程37Windows Socket的启动 使用Winsock API编制的网络应用程序中,在调用任何一个Winsock函数之前都必须检查协议栈安装情况,使用函数WSAStartup()完成操作。int WSAStartup(WORD wVersionRequested,LPWSADATA lpWSAData);wVersionRequested是一个WORD型(双字节型)数值,指定使用的版本号,对Winsock2.2而言,此参数的值为0 x0202,也可
18、以用宏MAKEWORD(2,2)来获得lpWSAData是一个指向WSADATA结构的指针,它返回关于Winsock实现的详细信息2022-7-24TCP/IP Socket网络编程38Winsock启动示例#include WORD wVersionRequested;WSADATA wsaData;wVersionRequested=MAKEWORD(2,2);if(WSAStartup(wVersionRequested,&wsaData)!=0)/Winsock初始化错误return;if(wsaData.wVersion!=wVersionRequested)/Winsock版本不匹
19、配WSACleanup();return;/说明WinsockDLL正确加载,可以执行以下代码2022-7-24TCP/IP Socket网络编程39创建套接口socket() 应用程序在使用套接口通信前,必须要拥有一个套接口,使用socket()函数来给应用程序创建一个套接口。SOCKET socket(int af,int type,int protocol);2022-7-24TCP/IP Socket网络编程40socket()参数说明af参数说明套接字接口要使用的协议地址族,地址族与协议族含义相同。如果想建立一个TCP或UDP,只能用常量AF_INET表示使用互联网协议(IP)地址。
20、Winsock还支持其他协议,但一般很少使用。type参数描述套接口的类型,af是AF_INET的时候只能为SOCK_STREAM、SOCK_DGRAM或SOCK_RAWprotocol说明该套接口使用的特定协议,当协议地址族af和协议类型type确定后,协议字段可以使用的值是限定的协议地址族套接口类型套接口类型使用的值协议字段互联网协议(IP)AF_INETTCPSOCK_STREAMIPPROTO_TCPUDPSOCK_DGRAMIPPROTO_UDPRawSOCK_RAWIPPROTO_RAWIPPROTO_ICMP2022-7-24TCP/IP Socket网络编程41指定本地地址bi
21、nd() 当socket()创建了一个套接口后,需要将该套接口与该主机上提供服务的某端口联系在一起,bind()函数用于完成这样的绑定。int bind(SOCKET s,const struct sockaddr FAR * name,int namelen);2022-7-24TCP/IP Socket网络编程42bind()参数说明 s标识一个未绑定的套接口描述字,它是socket()函数调用成功时返回的值 name是一个与指定协议有关的地址结构指针,存储了套接口的地址信息,Winsock中使用sockaddr_in结构指定IP地址和端口信息struct sockaddr_inshort
22、 sin_family;u_short sin_port;struct in_addrsin_addr;charsin_zero8;sin_family一般为AF_INET,表示使用IP地址族;sin_port是以网络字节序表示的16位端口号;sin_addr是网络字节序的32位IP地址;sin_zero字段一般不用,用0填充 namelen表示地址参数(name)的长度 IP地址参数为INADDR_ANY,则由系统内核来自动指定,port为0,则由系统自动指派一个10245000之间惟一的端口号2022-7-24TCP/IP Socket网络编程43bind()实例#include SOCK
23、ET s;sockaddr_in tcpaddr;int iSockErr;int port=5000; /端口号s=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);tcpaddr.sin_family=AF_INET;tcpaddr.sin_port=htons(port);tcpaddr.sin_addr.s_addr=htonl(INADDR_ANY);if(bind(s,(LPSOCKADDR)&tcpaddr,sizeof(tcpaddr)=SOCKET_ERROR)iSockErr=WSAGetLastError();/根据不同的错误类型进行不同的处
24、理return;函数调用成功,进行其他处理。2022-7-24TCP/IP Socket网络编程44服务器端启动监听listen()函数 在一个服务器端用socket()调用成功创建了一个套接口,并用bind()函数和一个指定的地址关联后,就需要指示该套接口进入监听连接请求状态,这需要通过listen()函数来实现int listen(SOCKET s,int backlog);s代表一个已绑定了地址,但还未建立连接的套接口描述字backlog指定了正在等待连接的最大队列长度2022-7-24TCP/IP Socket网络编程45客户端请求连接connect()函数 当服务器端建立好套接口并与
25、一个本地地址绑定后,就进入监听状态,等待客户发出连接请求。在客户端套接口建立好之后,就调用connect()函数来与服务器建立连接。int connect(SOCKET s,const struct sockaddr FAR * name,int namelen);2022-7-24TCP/IP Socket网络编程46connect()函数参数说明 s将要建立连接的套接口描述字 name是一个指向远端套接口地址结构(sockaddr_in)的指针,表示s套接口欲与其建立一条连接 namelen是服务器端的地址长度,即name的长度2022-7-24TCP/IP Socket网络编程47Con
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- TCP IP Socket 网络 编程
限制150内