lab8-SOCKET编程原理.ppt
《lab8-SOCKET编程原理.ppt》由会员分享,可在线阅读,更多相关《lab8-SOCKET编程原理.ppt(52页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、lab8-SOCKET编程原理 Four short words sum up what has lifted most successful Four short words sum up what has lifted most successful individuals above the crowd: a little bit more. individuals above the crowd: a little bit more. -author -author -date-date内容内容Socket简介简介uWindows SocketuLinux SocketSocket常用
2、函数介绍常用函数介绍TCP/IP网络程序框架与实例网络程序框架与实例通信方式通信方式u阻塞阻塞u非阻塞非阻塞为什么需要为什么需要Socket普通的普通的I/O操作过程操作过程u打开文件读打开文件读/写操作关闭文件写操作关闭文件TCP/IP协议被集成到操作系统的内核中,引协议被集成到操作系统的内核中,引入了新型的入了新型的“I/O”操作操作u进行网络操作的两个进程在不同的机器上,如何连进行网络操作的两个进程在不同的机器上,如何连接?接?u网络协议具有多样性,如何进行统一的操作网络协议具有多样性,如何进行统一的操作?需要一种需要一种通用通用的网络编程接口:的网络编程接口:Socketu独立于具体协
3、议独立于具体协议uBSD Socket(伯克利套接字)是通过标准的(伯克利套接字)是通过标准的UNIX文件描述符和其它程序通讯的一个方法,目前已经文件描述符和其它程序通讯的一个方法,目前已经被广泛移植到各个平台。被广泛移植到各个平台。Socket类型类型流式套接字流式套接字(SOCK_STREAM)u提供了一个面向连接、可靠的数据传输服务,数据提供了一个面向连接、可靠的数据传输服务,数据无差错、无重复的发送且按发送顺序接收。内设置无差错、无重复的发送且按发送顺序接收。内设置流量控制,避免数据流淹没慢的接收方。数据被看流量控制,避免数据流淹没慢的接收方。数据被看作是字节流,无长度限制。作是字节流
4、,无长度限制。数据报套接字数据报套接字(SOCK_DGRAM)u提供无连接服务。数据包以独立数据包的形式被发提供无连接服务。数据包以独立数据包的形式被发送,不提供无差错保证,数据可能丢失或重复,顺送,不提供无差错保证,数据可能丢失或重复,顺序发送,可能乱序接收。序发送,可能乱序接收。Socket的位置的位置两类系统中使用的两类系统中使用的Socket不同操作系统中的不同操作系统中的SocketuWindows Socket (Winsock)uLinux Socket (BSD Socket)Windows Socket简称简称Winsock,是在,是在Windows环境下使用的环境下使用的一
5、套网络编程规范,基于一套网络编程规范,基于4.3BSD的的BSD Socket API制定制定u1991年年Winsock 1.1,16位,由位,由WINSOCK.DLL支支持,主要用在持,主要用在Windows 95中中u1997年年Winsock 2.2 版,版,32位,由位,由WSOCK32.DLL支持,主要用在支持,主要用在Windows 98及以及以后的版本中后的版本中u已经成为已经成为Windows环境下网络编程的事实标准环境下网络编程的事实标准三类函数三类函数u与与BSD Socket相兼容的基本函数相兼容的基本函数u与与BSD Socket相兼容的网络信息检索函数相兼容的网络信
6、息检索函数uWindows专用扩展函数专用扩展函数Linux Socket基本上就是基本上就是BSD Socket需要使用的头文件需要使用的头文件u数据类型:数据类型:#include u函数定义:函数定义:#include TCP/IP网络程序框架网络程序框架面向连接的面向连接的C/S程序工作流程程序工作流程无连接的无连接的C/S程序工作流程程序工作流程面向连接的面向连接的C/S程序工作流程程序工作流程(TCP)服务器端工作流程服务器端工作流程u使用使用WSAStartup()函数检查系统协议栈安装情况函数检查系统协议栈安装情况u使用使用socket()函数创建服务器端通信套接口函数创建服务
7、器端通信套接口u使用使用bind()函数将创建的套接口与服务器地址绑定函数将创建的套接口与服务器地址绑定u使用使用listen()函数使服务器套接口做好接收连接请函数使服务器套接口做好接收连接请求准备求准备u使用使用accept()接收来自客户端由接收来自客户端由connect()函数发函数发出的连接请求出的连接请求u根据连接请求建立连接后,使用根据连接请求建立连接后,使用send()函数发送数函数发送数据,或者使用据,或者使用recv()函数接收数据函数接收数据u使用使用closesocket()函数关闭套接口(可以先用函数关闭套接口(可以先用shutdown()函数先关闭读写通道)函数先关
8、闭读写通道)u最后调用最后调用WSACleanup()函数结束函数结束Winsock Sockets API面向连接的面向连接的C/S程序工作流程程序工作流程(TCP)客户端程序工作流程客户端程序工作流程u使用使用WSAStartup()函数检查系统协议栈安装情况函数检查系统协议栈安装情况u使用使用socket()函数创建客户端套接口函数创建客户端套接口u使用使用connect()函数发出也服务器建立连接的请求函数发出也服务器建立连接的请求(调用前可以不用(调用前可以不用bind()端口号,由系统自动完成)端口号,由系统自动完成)u连接建立后使用连接建立后使用send()函数发送数据,或使用函
9、数发送数据,或使用recv()函数接收数据函数接收数据u使用使用closesocet()函数关闭套接口函数关闭套接口u最后调用最后调用WSACleanup()函数,结束函数,结束Winsock Sockets API面向连接的面向连接的C/S程序工作流程程序工作流程(TCP) 服务器与客户端五元组的建立服务器与客户端五元组的建立五元组服务器端五元组由socket()确定由服务器端调用bind()时确定由accept()确定客户端五元组由socket()确定由客户端的bind()调用确定。如果客户端没有进行bind()调用,或调用了bind()但没有指定具体地址或端口号,则由系统内核自动确定地址
10、和端口由connect()确定面向连接的面向连接的C/S程序工作流程图程序工作流程图(TCP)无连接的无连接的C/S程序工作流程程序工作流程(UDP)无连接的数据报传输服务通信时,客户端与服务无连接的数据报传输服务通信时,客户端与服务器端所使用的函数是类似的,其工作流程如下:器端所使用的函数是类似的,其工作流程如下:u使用使用WSAStartup()函数检查系统协议栈的安装情况函数检查系统协议栈的安装情况u使用使用socket()函数创建套接口,以确定协议类型函数创建套接口,以确定协议类型u调用调用bind()函数将创建的套接口与本地地址绑定,确函数将创建的套接口与本地地址绑定,确定本地地址和
11、本地端口号定本地地址和本地端口号u使用使用sendto()函数发送数据,或者使用函数发送数据,或者使用recvfrom()函函数接收数据数接收数据u使用使用closesocket()函数关闭套接口函数关闭套接口u调用调用WSACleanup()函数,结束函数,结束Windows Sockets API无连接的无连接的C/S程序工作流程程序工作流程(UDP)注意事项:注意事项:u通信的一方可以不用通信的一方可以不用bind()绑定地址和端口,由系统分配绑定地址和端口,由系统分配u不绑定不绑定IP地址和端口号的一方必须首先向绑定地址的一方发地址和端口号的一方必须首先向绑定地址的一方发送数据送数据u
12、无连接的应用程序也可以调用无连接的应用程序也可以调用connect()函数,但是它并不函数,但是它并不向对方发出建立连接的请求,而是在本地返回,由内核将向对方发出建立连接的请求,而是在本地返回,由内核将connect()中指定的目标中指定的目标IP地址和端口号记录下来,在以后地址和端口号记录下来,在以后的通信中就可以使用面向连接的数据发送函数的通信中就可以使用面向连接的数据发送函数send()和数据和数据接收函数接收函数recv()u无连接的数据报传输过程中,作为服务器的一方必须先启动无连接的数据报传输过程中,作为服务器的一方必须先启动u无连接客户端一般不调用无连接客户端一般不调用connec
13、t(),在数据发送前客户与,在数据发送前客户与服务器各自通过服务器各自通过socket()和和bind()建立了半相关,发送数据建立了半相关,发送数据时除指定本地套接口的地址外,还需要指定接收方套接口地时除指定本地套接口的地址外,还需要指定接收方套接口地址,从而在数据收发过程中动态建立全连接址,从而在数据收发过程中动态建立全连接无连接的无连接的C/S程序工作流程图程序工作流程图(UDP)阻塞通信与非阻塞通信阻塞通信与非阻塞通信阻塞方式:套接字进行阻塞方式:套接字进行I/O操作时,函数要等操作时,函数要等待到相关的操作完成以后才能返回,对提高处待到相关的操作完成以后才能返回,对提高处理机的利用率
14、不利,但编程简单。理机的利用率不利,但编程简单。非阻塞方式:套接字进行非阻塞方式:套接字进行I/O操作时,无论操操作时,无论操作成功与否,调用都会立即返回。作成功与否,调用都会立即返回。阻塞方式编程简单,一个套接口的默认操作模阻塞方式编程简单,一个套接口的默认操作模式为阻塞,可以调用函数式为阻塞,可以调用函数ioctlsocket()进行设进行设置。置。并发服务器并发服务器Socket常用函数介绍常用函数介绍基本函数基本函数网络信息检索函数网络信息检索函数基本函数基本函数网络连接函数网络连接函数usocket创建套接字创建套接字ubind绑定本机端口绑定本机端口uconnect建立连接建立连接
15、ulisten监听端口监听端口uaccept接受连接接受连接urecv, recvfrom数据接收数据接收usend, sendto数据发送数据发送uclose, shutdown关闭套接字关闭套接字基本函数基本函数转换函数转换函数uIP地址转换函数地址转换函数linet_addr()点分十进制数表示的点分十进制数表示的IP地址转换为网络字地址转换为网络字节序的节序的IP地址地址linet_ntoa()网络字节序的网络字节序的IP地址转换为点分十进制数地址转换为点分十进制数表示的表示的IP地址地址u字节排序函数字节排序函数lhtonl4字节主机字节序转换为网络字节序字节主机字节序转换为网络字节
16、序lntohl 4字节网络字节序转换为主机字节序字节网络字节序转换为主机字节序lhtons2字节主机字节序转换为网络字节序字节主机字节序转换为网络字节序lntohs2字节网络字节序转换为主机字节序字节网络字节序转换为主机字节序网络信息检索函数网络信息检索函数网络信息检索函数网络信息检索函数ugethostname获得主机名获得主机名ugetpeername获得与套接口相连的远程协议地址获得与套接口相连的远程协议地址ugetsockname获得套接口本地协议地址获得套接口本地协议地址ugethostbyname根据主机名取得主机信息根据主机名取得主机信息ugethostbyaddr根据主机地址取
17、得主机信息根据主机地址取得主机信息ugetprotobyname根据协议名取得主机协议信息根据协议名取得主机协议信息ugetprotobynumber根据协议号取得主机协议信息根据协议号取得主机协议信息ugetservbyname根据服务名取得相关服务信息根据服务名取得相关服务信息ugetservbyport根据端口号取得相关服务信息根据端口号取得相关服务信息ugetsockopt/setsockopt获取获取/设置一个套接口选项设置一个套接口选项 uioctlsocket设置套接口的工作方式设置套接口的工作方式Windows中的中的Socket编程编程Windows中的中的Socket编程编
18、程uWinsock 的启动的启动uWinsock API基本函数基本函数uTCP/IP网络程序框架网络程序框架(C/S模式模式)u阻塞与非阻塞通信方式阻塞与非阻塞通信方式u实例程序说明实例程序说明WinsockWinsock是一个基于是一个基于Socket模型的模型的API,在,在Windows系统中广泛使用系统中广泛使用需要包含头文件需要包含头文件Winsock2.h,需要使用库,需要使用库ws2_32.lib,包含办法可以用语句来告诉编译,包含办法可以用语句来告诉编译时调用该库时调用该库#pragma comment(lib,”ws2_32.lib”);如果使用如果使用Visual C+
19、6.0,可以通过,可以通过“工程工程” “设置设置”“工程设置工程设置”“链接链接”“对象对象/库模库模块块”中加入中加入“ws2_32.lib”Windows Socket的启动的启动 使用使用Winsock API编制的网络应用程序中,在调用任编制的网络应用程序中,在调用任何一个何一个Winsock函数之前都必须检查协议栈安装情况,函数之前都必须检查协议栈安装情况,使用函数使用函数WSAStartup()完成操作。完成操作。int WSAStartup(WORD wVersionRequested,LPWSADATA lpWSAData);wVersionRequested是一个是一个WO
20、RD型型(双字节型双字节型)数数值,指定使用的版本号,对值,指定使用的版本号,对Winsock2.2而言,此而言,此参数的值为参数的值为0 x0202,也可以用宏,也可以用宏MAKEWORD(2,2)来获得来获得lpWSAData是一个指向是一个指向WSADATA结构的指针,它结构的指针,它返回关于返回关于Winsock实现的详细信息实现的详细信息Winsock启动示例启动示例#include WORD wVersionRequested;WSADATA wsaData;wVersionRequested=MAKEWORD(2,2);if(WSAStartup(wVersionRequeste
21、d,&wsaData)!=0)/Winsock初始化错误初始化错误return;if(wsaData.wVersion!=wVersionRequested)/Winsock版本不匹配版本不匹配WSACleanup();return;/说明说明WinsockDLL正确加载,可以执行以下代码正确加载,可以执行以下代码创建套接口创建套接口socket() 应用程序在使用套接口通信前,必须要拥有一个套接口,使应用程序在使用套接口通信前,必须要拥有一个套接口,使用用socket()函数来给应用程序创建一个套接口。函数来给应用程序创建一个套接口。SOCKET socket(int af,int type
22、,int protocol);socket()参数说明参数说明 af参数说明套接字接口要使用的协议地址族,地址族与协议族含义相同。如果想参数说明套接字接口要使用的协议地址族,地址族与协议族含义相同。如果想建立一个建立一个TCP或或UDP,只能用常量,只能用常量AF_INET表示使用互联网协议表示使用互联网协议(IP)地址。地址。Winsock还支持其他协议,但一般很少使用。还支持其他协议,但一般很少使用。 type参数描述套接口的类型,参数描述套接口的类型,af是是AF_INET的时候只能为的时候只能为SOCK_STREAM、SOCK_DGRAM或或SOCK_RAW protocol说明该套接
23、口使用的特定协议,当协议地址族说明该套接口使用的特定协议,当协议地址族af和协议类型和协议类型type确定后,确定后,协议字段可以使用的值是限定的协议字段可以使用的值是限定的协议地址族套接口类型套接口类型使用的值协议字段互联网协议(IP)AF_INETTCPSOCK_STREAMIPPROTO_TCPUDPSOCK_DGRAMIPPROTO_UDPRawSOCK_RAWIPPROTO_RAWIPPROTO_ICMP指定本地地址指定本地地址bind() 当当socket()创建了一个套接口后,需要将该套接口与该主机创建了一个套接口后,需要将该套接口与该主机上提供服务的某端口联系在一起,上提供服务
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- lab8 SOCKET 编程 原理
限制150内