您好,欢迎访问三七文档
当前位置:首页 > IT计算机/网络 > 软件工程 > lab8-SOCKET编程原理
SOCKET编程原理内容Socket简介WindowsSocketLinuxSocketSocket常用函数介绍TCP/IP网络程序框架与实例通信方式阻塞非阻塞为什么需要Socket普通的I/O操作过程打开文件->读/写操作->关闭文件TCP/IP协议被集成到操作系统的内核中,引入了新型的“I/O”操作进行网络操作的两个进程在不同的机器上,如何连接?网络协议具有多样性,如何进行统一的操作?需要一种通用的网络编程接口:Socket独立于具体协议BSDSocket(伯克利套接字)是通过标准的UNIX文件描述符和其它程序通讯的一个方法,目前已经被广泛移植到各个平台。Socket类型流式套接字(SOCK_STREAM)提供了一个面向连接、可靠的数据传输服务,数据无差错、无重复的发送且按发送顺序接收。内设置流量控制,避免数据流淹没慢的接收方。数据被看作是字节流,无长度限制。数据报套接字(SOCK_DGRAM)提供无连接服务。数据包以独立数据包的形式被发送,不提供无差错保证,数据可能丢失或重复,顺序发送,可能乱序接收。Socket的位置应用层程序IP数据链路层与物理层TCPUDP流套接字接口数据报套接字接口两类系统中使用的Socket不同操作系统中的SocketWindowsSocket(Winsock)LinuxSocket(BSDSocket)WindowsSocket简称Winsock,是在Windows环境下使用的一套网络编程规范,基于4.3BSD的BSDSocketAPI制定1991年Winsock1.1,16位,由WINSOCK.DLL支持,主要用在Windows95中1997年Winsock2.2版,32位,由WSOCK32.DLL支持,主要用在Windows98及以后的版本中已经成为Windows环境下网络编程的事实标准三类函数与BSDSocket相兼容的基本函数与BSDSocket相兼容的网络信息检索函数Windows专用扩展函数LinuxSocket基本上就是BSDSocket需要使用的头文件数据类型:#includesys/types.h函数定义:#includesys/socket.hTCP/IP网络程序框架面向连接的C/S程序工作流程无连接的C/S程序工作流程面向连接的C/S程序工作流程(TCP)服务器端工作流程使用WSAStartup()函数检查系统协议栈安装情况使用socket()函数创建服务器端通信套接口使用bind()函数将创建的套接口与服务器地址绑定使用listen()函数使服务器套接口做好接收连接请求准备使用accept()接收来自客户端由connect()函数发出的连接请求根据连接请求建立连接后,使用send()函数发送数据,或者使用recv()函数接收数据使用closesocket()函数关闭套接口(可以先用shutdown()函数先关闭读写通道)最后调用WSACleanup()函数结束WinsockSocketsAPI面向连接的C/S程序工作流程(TCP)客户端程序工作流程使用WSAStartup()函数检查系统协议栈安装情况使用socket()函数创建客户端套接口使用connect()函数发出也服务器建立连接的请求(调用前可以不用bind()端口号,由系统自动完成)连接建立后使用send()函数发送数据,或使用recv()函数接收数据使用closesocet()函数关闭套接口最后调用WSACleanup()函数,结束WinsockSocketsAPI面向连接的C/S程序工作流程(TCP)服务器与客户端五元组的建立五元组协议本地IP地址,本地端口号远程IP地址,远程端口号服务器端五元组由socket()确定由服务器端调用bind()时确定由accept()确定客户端五元组由socket()确定由客户端的bind()调用确定。如果客户端没有进行bind()调用,或调用了bind()但没有指定具体地址或端口号,则由系统内核自动确定地址和端口由connect()确定面向连接的C/S程序工作流程图(TCP)WSAStartup()socket()bind()listen()accept()recv()send()closesocket()WSACleanup()WSAStartup()socket()connect()send()recv()closesocket()WSACleanup()三次握手过程建立TCP连接交换数据交换数据关闭TCP连接等待客户连接请求的到来服务器端客户端无连接的C/S程序工作流程(UDP)无连接的数据报传输服务通信时,客户端与服务器端所使用的函数是类似的,其工作流程如下:使用WSAStartup()函数检查系统协议栈的安装情况使用socket()函数创建套接口,以确定协议类型调用bind()函数将创建的套接口与本地地址绑定,确定本地地址和本地端口号使用sendto()函数发送数据,或者使用recvfrom()函数接收数据使用closesocket()函数关闭套接口调用WSACleanup()函数,结束WindowsSocketsAPI无连接的C/S程序工作流程(UDP)注意事项:通信的一方可以不用bind()绑定地址和端口,由系统分配不绑定IP地址和端口号的一方必须首先向绑定地址的一方发送数据无连接的应用程序也可以调用connect()函数,但是它并不向对方发出建立连接的请求,而是在本地返回,由内核将connect()中指定的目标IP地址和端口号记录下来,在以后的通信中就可以使用面向连接的数据发送函数send()和数据接收函数recv()无连接的数据报传输过程中,作为服务器的一方必须先启动无连接客户端一般不调用connect(),在数据发送前客户与服务器各自通过socket()和bind()建立了半相关,发送数据时除指定本地套接口的地址外,还需要指定接收方套接口地址,从而在数据收发过程中动态建立全连接无连接的C/S程序工作流程图(UDP)WSAStartup()交换数据socket()bind()recvfrom()sendto()closesocket()WSACleanup()WSAStartup()socket()bind()sendto()closesocket()WSACleanup()recvfrom()交换数据服务器客户端阻塞通信与非阻塞通信阻塞方式:套接字进行I/O操作时,函数要等待到相关的操作完成以后才能返回,对提高处理机的利用率不利,但编程简单。非阻塞方式:套接字进行I/O操作时,无论操作成功与否,调用都会立即返回。阻塞方式编程简单,一个套接口的默认操作模式为阻塞,可以调用函数ioctlsocket()进行设置。并发服务器WSAStartup()socket()bind()listen()accept()closesocket()WSACleanup()等待客户连接请求的到来服务器端recv()send()closesocket()CreateThread()派生线程主进程在accept之后派生新线程,然后主进程继续listen,处理新的连接请求,新线程自行和客户端通信Socket常用函数介绍基本函数网络信息检索函数基本函数网络连接函数socket创建套接字bind绑定本机端口connect建立连接listen监听端口accept接受连接recv,recvfrom数据接收send,sendto数据发送close,shutdown关闭套接字基本函数转换函数IP地址转换函数inet_addr()点分十进制数表示的IP地址转换为网络字节序的IP地址inet_ntoa()网络字节序的IP地址转换为点分十进制数表示的IP地址字节排序函数htonl4字节主机字节序转换为网络字节序ntohl4字节网络字节序转换为主机字节序htons2字节主机字节序转换为网络字节序ntohs2字节网络字节序转换为主机字节序网络信息检索函数网络信息检索函数gethostname获得主机名getpeername获得与套接口相连的远程协议地址getsockname获得套接口本地协议地址gethostbyname根据主机名取得主机信息gethostbyaddr根据主机地址取得主机信息getprotobyname根据协议名取得主机协议信息getprotobynumber根据协议号取得主机协议信息getservbyname根据服务名取得相关服务信息getservbyport根据端口号取得相关服务信息getsockopt/setsockopt获取/设置一个套接口选项ioctlsocket设置套接口的工作方式Windows中的Socket编程Windows中的Socket编程Winsock的启动WinsockAPI基本函数TCP/IP网络程序框架(C/S模式)阻塞与非阻塞通信方式实例程序说明WinsockWinsock是一个基于Socket模型的API,在Windows系统中广泛使用需要包含头文件Winsock2.h,需要使用库ws2_32.lib,包含办法可以用语句来告诉编译时调用该库#pragmacomment(lib,”ws2_32.lib”);如果使用VisualC++6.0,可以通过“工程”“设置”“工程设置”“链接”“对象/库模块”中加入“ws2_32.lib”WindowsSocket的启动使用WinsockAPI编制的网络应用程序中,在调用任何一个Winsock函数之前都必须检查协议栈安装情况,使用函数WSAStartup()完成操作。intWSAStartup(WORDwVersionRequested,LPWSADATAlpWSAData);wVersionRequested是一个WORD型(双字节型)数值,指定使用的版本号,对Winsock2.2而言,此参数的值为0x0202,也可以用宏MAKEWORD(2,2)来获得lpWSAData是一个指向WSADATA结构的指针,它返回关于Winsock实现的详细信息Winsock启动示例#includeWinsock2.hWORDwVersionRequested;WSADATAwsaData;wVersionRequested=MAKEWORD(2,2);if(WSAStartup(wVersionRequested,&wsaData)!=0){//Winsock初始化错误return;}if(wsaData.wVersion!=wVersionRequested){//Winsock版本不匹配WSACleanup();return;}//说明WinsockDLL正确加载,可以执行以下代码创建套接口socket()应用程序在使用套接口通信前,必须要拥有一个套接口,使用socket()函数来给应用程序创建一个套接口。SOCKETsocket(intaf,inttype,intprotocol);socket()参数说明af参数说明套接字接口要使用的协议地址族,地址族与协议族含义相同。如果想建立一个TCP或UDP,只能用常量AF_INET表示使用互联网协议(IP)地址。Winsock还支持其他协议,但一般很少使用。type参数描述套接口的类型,af是AF_INET的时候只能为SOCK_STREAM、SOCK_DGRAM或SOCK_RAWprotocol说明该套接口使用的特定协议,当协议地址族af和协议类型type确定后,协议字段可以使用的值是限定的协议地址族套接口类型套接口类型使用的值协议字段互联网协议(IP)AF_INETTCPSOCK_STREAMIPPROTO_TCPUDPSOCK_DGRAMIPPROTO_UDPRawSOCK_RAWIPPROTO_RAW
本文标题:lab8-SOCKET编程原理
链接地址:https://www.777doc.com/doc-7037621 .html