lab8-SOCKET编程原理

上传人:飞****9 文档编号:143100416 上传时间:2020-08-26 格式:PPT 页数:52 大小:269.01KB
返回 下载 相关 举报
lab8-SOCKET编程原理_第1页
第1页 / 共52页
lab8-SOCKET编程原理_第2页
第2页 / 共52页
lab8-SOCKET编程原理_第3页
第3页 / 共52页
lab8-SOCKET编程原理_第4页
第4页 / 共52页
lab8-SOCKET编程原理_第5页
第5页 / 共52页
点击查看更多>>
资源描述

《lab8-SOCKET编程原理》由会员分享,可在线阅读,更多相关《lab8-SOCKET编程原理(52页珍藏版)》请在金锄头文库上搜索。

1、SOCKET编程原理,内容,Socket简介 Windows Socket Linux Socket Socket常用函数介绍 TCP/IP网络程序框架与实例 通信方式 阻塞 非阻塞,为什么需要Socket,普通的I/O操作过程 打开文件读/写操作关闭文件 TCP/IP协议被集成到操作系统的内核中,引入了新型的“I/O”操作 进行网络操作的两个进程在不同的机器上,如何连接? 网络协议具有多样性,如何进行统一的操作? 需要一种通用的网络编程接口:Socket 独立于具体协议 BSD Socket(伯克利套接字)是通过标准的UNIX文件描述符和其它程序通讯的一个方法,目前已经被广泛移植到各个平台。

2、,Socket类型,流式套接字(SOCK_STREAM) 提供了一个面向连接、可靠的数据传输服务,数据无差错、无重复的发送且按发送顺序接收。内设置流量控制,避免数据流淹没慢的接收方。数据被看作是字节流,无长度限制。 数据报套接字(SOCK_DGRAM) 提供无连接服务。数据包以独立数据包的形式被发送,不提供无差错保证,数据可能丢失或重复,顺序发送,可能乱序接收。,Socket的位置,两类系统中使用的Socket,不同操作系统中的Socket Windows Socket (Winsock) Linux Socket (BSD Socket),Windows Socket,简称Winsock,是

3、在Windows环境下使用的一套网络编程规范,基于4.3BSD的BSD 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专用扩展函数,Linux Socket,基本上就是BSD Socket 需要使用的头文件 数据类型:#include

4、函数定义:#include ,TCP/IP网络程序框架,面向连接的C/S程序工作流程 无连接的C/S程序工作流程,面向连接的C/S程序工作流程(TCP),服务器端工作流程 使用WSAStartup()函数检查系统协议栈安装情况 使用socket()函数创建服务器端通信套接口 使用bind()函数将创建的套接口与服务器地址绑定 使用listen()函数使服务器套接口做好接收连接请求准备 使用accept()接收来自客户端由connect()函数发出的连接请求 根据连接请求建立连接后,使用send()函数发送数据,或者使用recv()函数接收数据 使用closesocket()函数关闭套接口(可以

5、先用shutdown()函数先关闭读写通道) 最后调用WSACleanup()函数结束Winsock Sockets API,面向连接的C/S程序工作流程(TCP),客户端程序工作流程 使用WSAStartup()函数检查系统协议栈安装情况 使用socket()函数创建客户端套接口 使用connect()函数发出也服务器建立连接的请求(调用前可以不用bind()端口号,由系统自动完成) 连接建立后使用send()函数发送数据,或使用recv()函数接收数据 使用closesocet()函数关闭套接口 最后调用WSACleanup()函数,结束Winsock Sockets API,面向连接的C

6、/S程序工作流程(TCP),服务器与客户端五元组的建立,面向连接的C/S程序工作流程图(TCP),无连接的C/S程序工作流程(UDP),无连接的数据报传输服务通信时,客户端与服务器端所使用的函数是类似的,其工作流程如下: 使用WSAStartup()函数检查系统协议栈的安装情况 使用socket()函数创建套接口,以确定协议类型 调用bind()函数将创建的套接口与本地地址绑定,确定本地地址和本地端口号 使用sendto()函数发送数据,或者使用recvfrom()函数接收数据 使用closesocket()函数关闭套接口 调用WSACleanup()函数,结束Windows Sockets

7、API,无连接的C/S程序工作流程(UDP),注意事项: 通信的一方可以不用bind()绑定地址和端口,由系统分配 不绑定IP地址和端口号的一方必须首先向绑定地址的一方发送数据 无连接的应用程序也可以调用connect()函数,但是它并不向对方发出建立连接的请求,而是在本地返回,由内核将connect()中指定的目标IP地址和端口号记录下来,在以后的通信中就可以使用面向连接的数据发送函数send()和数据接收函数recv() 无连接的数据报传输过程中,作为服务器的一方必须先启动 无连接客户端一般不调用connect(),在数据发送前客户与服务器各自通过socket()和bind()建立了半相关

8、,发送数据时除指定本地套接口的地址外,还需要指定接收方套接口地址,从而在数据收发过程中动态建立全连接,无连接的C/S程序工作流程图(UDP),阻塞通信与非阻塞通信,阻塞方式:套接字进行I/O操作时,函数要等待到相关的操作完成以后才能返回,对提高处理机的利用率不利,但编程简单。 非阻塞方式:套接字进行I/O操作时,无论操作成功与否,调用都会立即返回。 阻塞方式编程简单,一个套接口的默认操作模式为阻塞,可以调用函数ioctlsocket()进行设置。,并发服务器,Socket常用函数介绍,基本函数 网络信息检索函数,基本函数,网络连接函数 socket创建套接字 bind绑定本机端口 connec

9、t建立连接 listen监听端口 accept接受连接 recv, recvfrom数据接收 send, sendto数据发送 close, shutdown关闭套接字,基本函数,转换函数 IP地址转换函数 inet_addr()点分十进制数表示的IP地址转换为网络字节序的IP地址 inet_ntoa()网络字节序的IP地址转换为点分十进制数表示的IP地址 字节排序函数 htonl4字节主机字节序转换为网络字节序 ntohl 4字节网络字节序转换为主机字节序 htons2字节主机字节序转换为网络字节序 ntohs2字节网络字节序转换为主机字节序,网络信息检索函数,网络信息检索函数 gethos

10、tname获得主机名 getpeername获得与套接口相连的远程协议地址 getsockname获得套接口本地协议地址 gethostbyname根据主机名取得主机信息 gethostbyaddr根据主机地址取得主机信息 getprotobyname根据协议名取得主机协议信息 getprotobynumber根据协议号取得主机协议信息 getservbyname根据服务名取得相关服务信息 getservbyport根据端口号取得相关服务信息 getsockopt/setsockopt获取/设置一个套接口选项 ioctlsocket设置套接口的工作方式,Windows中的Socket编程,Wi

11、ndows中的Socket编程 Winsock 的启动 Winsock API基本函数 TCP/IP网络程序框架(C/S模式) 阻塞与非阻塞通信方式 实例程序说明,Winsock,Winsock是一个基于Socket模型的API,在Windows系统中广泛使用 需要包含头文件Winsock2.h,需要使用库ws2_32.lib,包含办法可以用语句来告诉编译时调用该库 #pragma comment(lib,”ws2_32.lib”); 如果使用Visual C+ 6.0,可以通过“工程” “设置”“工程设置”“链接”“对象/库模块”中加入“ws2_32.lib”,Windows Socket的

12、启动,使用Winsock API编制的网络应用程序中,在调用任何一个Winsock函数之前都必须检查协议栈安装情况,使用函数WSAStartup()完成操作。int WSAStartup( WORD wVersionRequested, LPWSADATA lpWSAData ); wVersionRequested是一个WORD型(双字节型)数值,指定使用的版本号,对Winsock2.2而言,此参数的值为0 x0202,也可以用宏MAKEWORD(2,2)来获得 lpWSAData是一个指向WSADATA结构的指针,它返回关于Winsock实现的详细信息,Winsock启动示例,#inclu

13、de WORD wVersionRequested; WSADATA wsaData; wVersionRequested=MAKEWORD(2,2); if(WSAStartup(wVersionRequested, /说明WinsockDLL正确加载,可以执行以下代码,创建套接口socket(),应用程序在使用套接口通信前,必须要拥有一个套接口,使用socket()函数来给应用程序创建一个套接口。 SOCKET socket( int af, int type, int protocol );,socket()参数说明,af参数说明套接字接口要使用的协议地址族,地址族与协议族含义相同。如果

14、想建立一个TCP或UDP,只能用常量AF_INET表示使用互联网协议(IP)地址。Winsock还支持其他协议,但一般很少使用。 type参数描述套接口的类型,af是AF_INET的时候只能为SOCK_STREAM、SOCK_DGRAM或SOCK_RAW protocol说明该套接口使用的特定协议,当协议地址族af和协议类型type确定后,协议字段可以使用的值是限定的,指定本地地址bind(),当socket()创建了一个套接口后,需要将该套接口与该主机上提供服务的某端口联系在一起,bind()函数用于完成这样的绑定。 int bind( SOCKET s, const struct sock

15、addr FAR * name, int namelen );,bind()参数说明,s标识一个未绑定的套接口描述字,它是socket()函数调用成功时返回的值 name是一个与指定协议有关的地址结构指针,存储了套接口的地址信息,Winsock中使用sockaddr_in结构指定IP地址和端口信息 struct sockaddr_in short sin_family; u_short sin_port; struct in_addrsin_addr; charsin_zero8; sin_family一般为AF_INET,表示使用IP地址族;sin_port是以网络字节序表示的16位端口号;

16、sin_addr是网络字节序的32位IP地址;sin_zero字段一般不用,用0填充 namelen表示地址参数(name)的长度 IP地址参数为INADDR_ANY,则由系统内核来自动指定 port为0,则由系统自动指派一个10245000之间惟一的端口号,bind()实例,#include SOCKET 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) 函数调用成功,进行其他处理。,服务器端启动监听listen()函数,在一个服务器端用socket()调用成功创建了一个套接口,并用bind()函数和一个指定的地址关联后,就需要指示该套接口进入监听连接请求状态,这需要通过listen

展开阅读全文
相关资源
相关搜索

当前位置:首页 > IT计算机/网络 > 其它相关文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号