lab8SOCKET编程原理行业知识

上传人:cn****1 文档编号:567612992 上传时间:2024-07-21 格式:PPT 页数:52 大小:533KB
返回 下载 相关 举报
lab8SOCKET编程原理行业知识_第1页
第1页 / 共52页
lab8SOCKET编程原理行业知识_第2页
第2页 / 共52页
lab8SOCKET编程原理行业知识_第3页
第3页 / 共52页
lab8SOCKET编程原理行业知识_第4页
第4页 / 共52页
lab8SOCKET编程原理行业知识_第5页
第5页 / 共52页
点击查看更多>>
资源描述

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

1、SOCKET编程原理编程原理1向阳课件内容内容Socket简介介uWindows SocketuLinux SocketSocket常用函数介常用函数介绍TCP/IP网网络程序框架与程序框架与实例例通信方式通信方式u阻塞阻塞u非阻塞非阻塞2为什么需要为什么需要Socket普通的普通的I/O操作操作过程程u打开文件打开文件读/写操作关写操作关闭文件文件TCP/IP协议被集成到操作系被集成到操作系统的内核中,引的内核中,引入了新型的入了新型的“I/O”操作操作u进行网行网络操作的两个操作的两个进程在不同的机器上,如何程在不同的机器上,如何连接?接?u网网络协议具有多具有多样性,如何性,如何进行行统

2、一的操作一的操作?需要一种需要一种通用通用的网的网络编程接口:程接口:Socketu独立于具体独立于具体协议uBSD Socket(伯克利套接字)是通(伯克利套接字)是通过标准的准的UNIX文件描述符和其它程序通文件描述符和其它程序通讯的一个方法,目前已的一个方法,目前已经被广泛移植到各个平台。被广泛移植到各个平台。3Socket类型类型流式套接字流式套接字(SOCK_STREAM)u提供了一个面向提供了一个面向连接、可靠的数据接、可靠的数据传输服服务,数据,数据无差无差错、无重复的、无重复的发送且按送且按发送送顺序接收。内序接收。内设置置流量控制,避免数据流淹没慢的接收方。数据被看流量控制,

3、避免数据流淹没慢的接收方。数据被看作是字作是字节流,无流,无长度限制。度限制。数据数据报套接字套接字(SOCK_DGRAM)u提供无提供无连接服接服务。数据包以独立数据包的形式被。数据包以独立数据包的形式被发送,不提供无差送,不提供无差错保保证,数据可能,数据可能丢失或重复,失或重复,顺序序发送,可能乱序接收。送,可能乱序接收。4Socket的位置的位置5两类系统中使用的两类系统中使用的Socket不同操作系不同操作系统中的中的SocketuWindows Socket (Winsock)uLinux Socket (BSD Socket)6Windows Socket简称称Winsock,是

4、在,是在Windows环境下使用的境下使用的一套网一套网络编程程规范,基于范,基于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相兼容的网相兼

5、容的网络信息信息检索函数索函数uWindows专用用扩展函数展函数7Linux Socket基本上就是基本上就是BSD Socket需要使用的需要使用的头文件文件u数据数据类型:型:#include u函数定函数定义:#include 8TCP/IP网络程序框架网络程序框架面向面向连接的接的C/S程序工作流程程序工作流程无无连接的接的C/S程序工作流程程序工作流程9面向连接的面向连接的C/S程序工作流程程序工作流程(TCP)服服务器端工作流程器端工作流程u使用使用WSAStartup()函数函数检查系系统协议栈安装情况安装情况u使用使用socket()函数函数创建服建服务器端通信套接口器端通信

6、套接口u使用使用bind()函数将函数将创建的套接口与服建的套接口与服务器地址器地址绑定定u使用使用listen()函数使服函数使服务器套接口做好接收器套接口做好接收连接接请求准求准备u使用使用accept()接收来自客接收来自客户端由端由connect()函数函数发出的出的连接接请求求u根据根据连接接请求建立求建立连接后,使用接后,使用send()函数函数发送数送数据,或者使用据,或者使用recv()函数接收数据函数接收数据u使用使用closesocket()函数关函数关闭套接口(可以先用套接口(可以先用shutdown()函数先关函数先关闭读写通道)写通道)u最后最后调用用WSAClean

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

8、t()函数关函数关闭套接口套接口u最后最后调用用WSACleanup()函数,函数,结束束Winsock Sockets API11面向连接的面向连接的C/S程序工作流程程序工作流程(TCP)服务器与客户端五元组的建立服务器与客户端五元组的建立五元组五元组服务器服务器端五元端五元组组由由socket()确定确定由服务器端调用由服务器端调用bind()时确定时确定由由accept()确定确定客户端客户端五元组五元组由由socket()确定确定由客户端的由客户端的bind()调用确定。调用确定。如果客户端没有进行如果客户端没有进行bind()调调用,或调用了用,或调用了bind()但没有指但没有指

9、定具体地址或端口号,则由系定具体地址或端口号,则由系统内核自动确定地址和端口统内核自动确定地址和端口由由connect()确定确定12面向连接的面向连接的C/S程序工作流程图程序工作流程图(TCP)13无连接的无连接的C/S程序工作流程程序工作流程(UDP)无无连接的数据接的数据报传输服服务通信通信时,客,客户端与服端与服务器端所使用的函数是器端所使用的函数是类似的,其工作流程如下:似的,其工作流程如下:u使用使用WSAStartup()函数函数检查系系统协议栈的安装情况的安装情况u使用使用socket()函数函数创建套接口,以确定建套接口,以确定协议类型型u调用用bind()函数将函数将创建

10、的套接口与本地地址建的套接口与本地地址绑定,确定,确定本地地址和本地端口号定本地地址和本地端口号u使用使用sendto()函数函数发送数据,或者使用送数据,或者使用recvfrom()函函数接收数据数接收数据u使用使用closesocket()函数关函数关闭套接口套接口u调用用WSACleanup()函数,函数,结束束Windows Sockets API14无连接的无连接的C/S程序工作流程程序工作流程(UDP)注意事注意事项:u通信的一方可以不用通信的一方可以不用bind()绑定地址和端口,由系定地址和端口,由系统分配分配u不不绑定定IP地址和端口号的一方必地址和端口号的一方必须首先向首先

11、向绑定地址的一方定地址的一方发送数据送数据u无无连接的接的应用程序也可以用程序也可以调用用connect()函数,但是它并不函数,但是它并不向向对方方发出建立出建立连接的接的请求,而是在本地返回,由内核将求,而是在本地返回,由内核将connect()中指定的目中指定的目标IP地址和端口号地址和端口号记录下来,在以后的通信中下来,在以后的通信中就可以使用面向就可以使用面向连接的数据接的数据发送函数送函数send()和数据接收函数和数据接收函数recv()u无无连接的数据接的数据报传输过程中,作程中,作为服服务器的一方必器的一方必须先启先启动u无无连接客接客户端一般不端一般不调用用connect(

12、),在数据,在数据发送前客送前客户与与服服务器各自通器各自通过socket()和和bind()建立了半相关,建立了半相关,发送数据送数据时除指定本地套接口的地址外,除指定本地套接口的地址外,还需要指定接收方套接口地需要指定接收方套接口地址,从而在数据收址,从而在数据收发过程中程中动态建立全建立全连接接15无连接的无连接的C/S程序工作流程图程序工作流程图(UDP)16阻塞通信与非阻塞通信阻塞通信与非阻塞通信阻塞方式:套接字阻塞方式:套接字进行行I/O操作操作时,函数要等,函数要等待到相关的操作完成以后才能返回,待到相关的操作完成以后才能返回,对提高提高处理机的利用率不利,但理机的利用率不利,但

13、编程程简单。非阻塞方式:套接字非阻塞方式:套接字进行行I/O操作操作时,无,无论操操作成功与否,作成功与否,调用都会立即返回。用都会立即返回。阻塞方式阻塞方式编程程简单,一个套接口的默,一个套接口的默认操作模操作模式式为阻塞,可以阻塞,可以调用函数用函数ioctlsocket()进行行设置。置。17并发服务器并发服务器18Socket常用函数介绍常用函数介绍基本函数基本函数网网络信息信息检索函数索函数19基本函数基本函数网网络连接函数接函数usocket创建套接字建套接字ubind绑定本机端口定本机端口uconnect建立建立连接接ulisten监听端口听端口uaccept接受接受连接接ure

14、cv, recvfrom数据接收数据接收usend, sendto数据数据发送送uclose, shutdown关关闭套接字套接字20基本函数基本函数转换函数函数uIP地址地址转换函数函数linet_addr()点分十点分十进制数表示的制数表示的IP地址地址转换为网网络字字节序的序的IP地址地址linet_ntoa()网网络字字节序的序的IP地址地址转换为点分十点分十进制数制数表示的表示的IP地址地址u字字节排序函数排序函数lhtonl4字字节主机字主机字节序序转换为网网络字字节序序lntohl 4字字节网网络字字节序序转换为主机字主机字节序序lhtons2字字节主机字主机字节序序转换为网网络

15、字字节序序lntohs2字字节网网络字字节序序转换为主机字主机字节序序21网络信息检索函数网络信息检索函数网网络信息信息检索函数索函数ugethostname获得主机名得主机名ugetpeername获得与套接口相得与套接口相连的的远程程协议地址地址ugetsockname获得套接口本地得套接口本地协议地址地址ugethostbyname根据主机名取得主机信息根据主机名取得主机信息ugethostbyaddr根据主机地址取得主机信息根据主机地址取得主机信息ugetprotobyname根据根据协议名取得主机名取得主机协议信息信息ugetprotobynumber根据根据协议号取得主机号取得主机

16、协议信息信息ugetservbyname根据服根据服务名取得相关服名取得相关服务信息信息ugetservbyport根据端口号取得相关服根据端口号取得相关服务信息信息ugetsockopt/setsockopt获取取/设置一个套接口置一个套接口选项 uioctlsocket设置套接口的工作方式置套接口的工作方式22Windows中的中的Socket编程编程Windows中的中的Socket编程程uWinsock 的启的启动uWinsock API基本函数基本函数uTCP/IP网网络程序框架程序框架(C/S模式模式)u阻塞与非阻塞通信方式阻塞与非阻塞通信方式u实例程序例程序说明明23Winsoc

17、kWinsock是一个基于是一个基于Socket模型的模型的API,在,在Windows系系统中广泛使用中广泛使用需要包含需要包含头文件文件Winsock2.h,需要使用,需要使用库ws2_32.lib,包含,包含办法可以用法可以用语句来告句来告诉编译时调用用该库#pragma comment(lib,”ws2_32.lib”);如果使用如果使用Visual C+ 6.0,可以通,可以通过“工程工程” “设置置”“工程工程设置置”“链接接”“对象象/库模模块”中加入中加入“ws2_32.lib”24Windows Socket的启动的启动使用使用Winsock API编制的网制的网络应用程序中

18、,在用程序中,在调用任用任何一个何一个Winsock函数之前都必函数之前都必须检查协议栈安装情况,安装情况,使用函数使用函数WSAStartup()完成操作。完成操作。int WSAStartup(WORD wVersionRequested,LPWSADATA lpWSAData);wVersionRequested是一个是一个WORD型型(双字双字节型型)数数值,指定使用的版本号,指定使用的版本号,对Winsock2.2而言,此而言,此参数的参数的值为0x0202,也可以用宏,也可以用宏MAKEWORD(2,2)来来获得得lpWSAData是一个指向是一个指向WSADATA结构的指构的指针

19、,它,它返回关于返回关于Winsock实现的的详细信息信息25Winsock启动示例启动示例#include WORD wVersionRequested;WSADATA wsaData;wVersionRequested=MAKEWORD(2,2);if(WSAStartup(wVersionRequested,&wsaData)!=0)/Winsock初始化初始化错误return;if(wsaData.wVersion!=wVersionRequested)/Winsock版本不匹配版本不匹配WSACleanup();return;/说明明WinsockDLL正确加正确加载,可以,可以执行

20、以下代行以下代码26创建套接口创建套接口socket()应用程序在使用套接口通信前,必用程序在使用套接口通信前,必须要要拥有一个套接口,使有一个套接口,使用用socket()函数来函数来给应用程序用程序创建一个套接口。建一个套接口。SOCKET socket(int af,int type,int protocol); 27socket()参数说明参数说明af参数说明套接字接口要使用的协议地址族,地址族与协议族含义相同。如果想参数说明套接字接口要使用的协议地址族,地址族与协议族含义相同。如果想建立一个建立一个TCP或或UDP,只能用常量,只能用常量AF_INET表示使用互联网协议表示使用互联网

21、协议(IP)地址。地址。Winsock还支持其他协议,但一般很少使用。还支持其他协议,但一般很少使用。type参数描述套接口的类型,参数描述套接口的类型,af是是AF_INET的时候只能为的时候只能为SOCK_STREAM、SOCK_DGRAM或或SOCK_RAWprotocol说明该套接口使用的特定协议,当协议地址族说明该套接口使用的特定协议,当协议地址族af和协议类型和协议类型type确定后,确定后,协议字段可以使用的值是限定的协议字段可以使用的值是限定的 协议协议地址族地址族套接口类型套接口类型套接口类型使用套接口类型使用的值的值协议字段协议字段互联互联网协网协议议(IP)AF_INET

22、TCPSOCK_STREAMIPPROTO_TCPUDPSOCK_DGRAMIPPROTO_UDPRawSOCK_RAWIPPROTO_RAWIPPROTO_ICMP28指定本地地址指定本地地址bind()当当socket()创建了一个套接口后,需要将建了一个套接口后,需要将该套接口与套接口与该主机主机上提供服上提供服务的某端口的某端口联系在一起,系在一起,bind()函数用于完成函数用于完成这样的的绑定。定。int bind(SOCKET s,const struct sockaddr FAR * name,int namelen);29bind()参数说明参数说明s标识一个未一个未绑定的套

23、接口描述字,它是定的套接口描述字,它是socket()函数函数调用用成功成功时返回的返回的值name是一个与指定是一个与指定协议有关的地址有关的地址结构指构指针,存,存储了套接了套接口的地址信息,口的地址信息,Winsock中使用中使用sockaddr_in结构指定构指定IP地地址和端口信息址和端口信息struct sockaddr_inshort sin_family;u_short sin_port;struct in_addrsin_addr;charsin_zero8;sin_family一般一般为AF_INET,表示使用,表示使用IP地址族;地址族;sin_port是以网是以网络字字

24、节序表序表示的示的16位端口号;位端口号;sin_addr是网是网络字字节序的序的32位位IP地址;地址;sin_zero字段一般不字段一般不用,用用,用0填充填充namelen表示地址参数表示地址参数(name)的的长度度IP地址参数地址参数为INADDR_ANY,则由系由系统内核来自内核来自动指定指定port为0,则由系由系统自自动指派一个指派一个10245000之之间惟一的端惟一的端口号口号30bind()实例实例#include SOCKET s;sockaddr_in tcpaddr;int iSockErr;int port=5000; /端口号端口号s=socket(AF_INE

25、T,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();/根据不同的根据不同的错误类型型进行不同的行不同的处理理return;函数函数调用成功,用成功,进行其他行其他处理。理。31服务器端启动监听服务器端启动监听listen()函数

26、函数在一个服在一个服务器端用器端用socket()调用成功用成功创建了一个套接建了一个套接口,并用口,并用bind()函数和一个指定的地址关函数和一个指定的地址关联后,就需后,就需要指示要指示该套接口套接口进入入监听听连接接请求状求状态,这需要通需要通过listen()函数来函数来实现int listen(SOCKET s,int backlog);s代表一个已代表一个已绑定了地址,但定了地址,但还未建立未建立连接的套接口接的套接口描述字描述字backlog指定了正在等待指定了正在等待连接的最大接的最大队列列长度度32客户端请求连接客户端请求连接connect()函数函数当服当服务器端建立好套

27、接口并与一个本地地址器端建立好套接口并与一个本地地址绑定后,定后,就就进入入监听状听状态,等待客,等待客户发出出连接接请求。在客求。在客户端套接口建立好之后,就端套接口建立好之后,就调用用connect()函数来与服函数来与服务器建立器建立连接。接。int connect(SOCKET s,const struct sockaddr FAR * name,int namelen);33connect()函数参数说明函数参数说明s将要建立将要建立连接的套接口描述字接的套接口描述字name是一个指向是一个指向远端套接口地址端套接口地址结构构(sockaddr_in)的指的指针,表示,表示s套接口欲

28、与其建套接口欲与其建立一条立一条连接接namelen是服是服务器端的地址器端的地址长度,即度,即name的的长度度34Connect()函数的说明函数的说明在客在客户端使用端使用该函数函数请求建立求建立连接接时,将激活建立,将激活建立连接的三次握手,用来建立一条到服接的三次握手,用来建立一条到服务器器TCP的的连接。接。如果如果调用用该函数前没有函数前没有调用用bind()来来绑定本地地址,定本地地址,则由系由系统隐式式绑定一个地址到定一个地址到该套接口套接口该函数用在函数用在UDP的客的客户端端时,connect()函数并不是函数并不是真正地真正地发出建立出建立请求求连接的接的请求,求,调用

29、将从本地操作用将从本地操作系系统直接返回。直接返回。这样可以将服可以将服务器的地址信息保存下器的地址信息保存下来,在后来,在后续UDP端口端口发送数据送数据时,由套接口自,由套接口自动在在发送函数中填入服送函数中填入服务器地址,而不需要由器地址,而不需要由应用程序在用程序在调用用发送函数送函数时填入填入35服务器端接受连接服务器端接受连接accept()函数函数在服在服务器端通器端通过listen()函数函数调用表示服用表示服务器器进入入监听客听客户的的连接接请求状求状态,而在服,而在服务器端器端调用用accept()函数函数时表示可以接收来自客表示可以接收来自客户端端由由connect()发

30、出的出的连接接请求,双方求,双方进入入连接接状状态。SOCKET accept(SOCKET s,struct sockaddr FAR * addr,int FAR * addrlen);36accept()函数参数说明函数参数说明s标识一个套接字,一个套接字,该套接口套接口处于于监听状听状态addr是一个地址是一个地址结构的指构的指针,用来存放,用来存放发出出连接接请求的那个求的那个客客户机的机的IP地址信息地址信息addrlen指出客指出客户套接口地址套接口地址结构的构的长度度函数函数说明明:该函数用于面向函数用于面向连接的服接的服务器端,器端,在在IP协议族中,只用于族中,只用于TCP

31、服服务器端器端37发送数据发送数据-send()函数函数在已在已经建立建立连接的套接口上接的套接口上发送数据,可以使送数据,可以使用用send()函数函数int send(SOCKET s,const char FAR * buf,int len,int flags);38send()函数参数说明函数参数说明s用于用于标识已建立已建立连接的套接字接的套接字buf是一个字符是一个字符缓冲区,内有将要冲区,内有将要发送的数据送的数据len即将即将发送的送的缓冲区中的字符数冲区中的字符数flags用于控制数据用于控制数据传输方式,方式,0表示按正常方式表示按正常方式发送送数据;宏数据;宏MSG_DO

32、NTROUTE说明系明系统目目标主机就在主机就在直接直接连接的本地网接的本地网络中,无需路由中,无需路由选择;MSG_OOB指出数据是按指出数据是按带外数据外数据发送的送的函数函数说明明:send()函数适用于已建立函数适用于已建立连接的数据接的数据报或或流式套接口流式套接口发送数据,送数据,对于数据于数据报类型套接口必型套接口必须注注意意发送数据送数据长度不大于通信子网的度不大于通信子网的IP包最大包最大长度度39接收数据接收数据recv()函数函数对于已建立于已建立连接的套接口来接的套接口来说,要从套接口上,要从套接口上接收数据,就要使用接收数据,就要使用recv()函数。函数。int r

33、ecv(SOCKET s,char FAR * buf,int len,int flags);40recv()函数参数说明函数参数说明s为已建立已建立连接的套接口接的套接口buf为用于接收数据的用于接收数据的缓冲区冲区len为缓冲区的冲区的长度度flags指定指定调用的方式。用的方式。0表示接收的是正常数表示接收的是正常数据,无特殊行据,无特殊行为。MSG_PEEK表示会使有用表示会使有用的数据复制到所提供的接收端的数据复制到所提供的接收端缓冲区内,但是冲区内,但是没有从系没有从系统缓冲区中将数据冲区中将数据删除。除。MSG_OOB表示表示处理理带外数据。外数据。41无连接的套接口上接收数据无

34、连接的套接口上接收数据-recvfrom()对于无于无连接的套接口来接的套接口来说,要从套接口上接收一个数,要从套接口上接收一个数据据报并保存并保存发送数据的源地址,就要使用送数据的源地址,就要使用recvfrom()函数。函数。int recvfrom(SOCKET s,char FAR * buf,int len,int flags,struct sockaddr FAR * from,int FAR * fromlen);42recvfrom()函数参数说明函数参数说明s标识一个套接口的描述字一个套接口的描述字buf接收数据的接收数据的缓冲区冲区len接收数据接收数据缓冲区的冲区的长度度

35、flags调用操作方式,同用操作方式,同recv()中的中的flagsfrom可可选指指针,指向装有源地址的,指向装有源地址的缓冲区冲区fromlen可可选指指针,指向,指向from缓冲区的冲区的长度度值函数函数说明明:该函数的用法与有函数的用法与有连接接时recv()的的用法一致,要注意的是用法一致,要注意的是该函数也可以用于有函数也可以用于有连接接时数据的接收数据的接收43在无连接套接口上发送数据在无连接套接口上发送数据-sendto()对于无于无连接的套接口来接的套接口来说,要从套接口上,要从套接口上发送送一个数据一个数据报,就要使用,就要使用sendto()函数函数int sendto

36、(SOCKET s,const char FAR * buf,int len,int flags,const struct sockaddr FAR * to,int tolen);44sendto()函数参数说明函数参数说明s本机的套接字本机的套接字buf待待发送数据的送数据的缓冲区冲区len指明指明buf缓冲区中要冲区中要发送的数据送的数据长度度flags调用方式用方式标志位,同志位,同send()中的中的flagsto可可选指指针,指向接收数据的目的套接口地址,指向接收数据的目的套接口地址tolen是是to所指的地址的所指的地址的长度度函数函数说明明:该函数的使用方法函数的使用方法类似似

37、send()函数,当用函数,当用于无于无连接套接字接口,接套接字接口,调用函数前要用函数前要设置,指出目置,指出目标IP地址和目地址和目标端口号。如果用于有端口号。如果用于有连接的套接口接的套接口时,则不能指定目不能指定目标地址和目地址和目标端口,将端口,将to设置置为空,地空,地址址长度度设为0。当然在有。当然在有连接的情况下很少使用接的情况下很少使用该函函数数45关闭读写通道关闭读写通道-shutdown()函数函数在一个套接口上的在一个套接口上的读写操作完成后,写操作完成后,应该首先首先使用使用shutdown()函数来关函数来关闭套接口的套接口的读通道、通道、写通道或写通道或读写通道,

38、写通道,这样做的好做的好处是当双方不是当双方不再有数据要再有数据要发送或接收送或接收时,可以通知,可以通知对方,以方,以防止数据防止数据丢失,并能失,并能“优雅雅”地关地关闭连接接int shutdown(SOCKET s,int how);46shutdown()函数参数说明函数参数说明s标识一个套接口的描述字标识一个套接口的描述字how是一个标志,用于描述禁止哪些操作,取值如下表所示是一个标志,用于描述禁止哪些操作,取值如下表所示关闭方式关闭方式参数值参数值说明说明SD_RECEIVE0表示不允许再调用接收函数,它关闭读通道。套接口表示不允许再调用接收函数,它关闭读通道。套接口接收缓冲区中

39、的所有数据都被丢弃,并且有新数据到接收缓冲区中的所有数据都被丢弃,并且有新数据到达套接口时,也被达套接口时,也被TCP协议层丢弃,但它对发送缓冲协议层丢弃,但它对发送缓冲区没有影响,进程仍然可以在套接口上发送数据区没有影响,进程仍然可以在套接口上发送数据SD_SEND1表示不允许再调用发送函数,它关闭写通道。在套接表示不允许再调用发送函数,它关闭写通道。在套接口发送缓冲区中的数据都被发送出去,得到接收端确口发送缓冲区中的数据都被发送出去,得到接收端确认之后,就生成一个认之后,就生成一个FIN包关闭连接。但它对接收缓包关闭连接。但它对接收缓冲区没有影响,进程仍然可以在套接口上接收数据冲区没有影响

40、,进程仍然可以在套接口上接收数据SD_BOTH2关闭读写通道,相当于执行了上面关闭读写通道,相当于执行了上面SD_RECEIVE和和SD_SEND两个命令两个命令47关闭套接口关闭套接口-closesocket()函数函数shutdown函数只关函数只关闭读写通道,并不关写通道,并不关闭套套接口,且套接口所占有的接口,且套接口所占有的资源将被一直保留到源将被一直保留到closesocket()调用之前。用之前。一个套接口不再使用一个套接口不再使用时一定要关一定要关闭这个套接口,个套接口,以以释放与放与该套接口关套接口关联的所有的所有资源,包括等候源,包括等候处理的数据。理的数据。int clo

41、sesocket(SOCKET s);参数参数s表示即将被关表示即将被关闭的套接口的套接口48IP地址转换函数地址转换函数char * inet_ntoa ( struct in_addr in )in为传入参数,表示一个入参数,表示一个结构型的构型的IP主机地址,主机地址,该函数将一个函数将一个32位数字表示的位数字表示的IP地址地址转换成点成点分十分十进制制IP地址字符串地址字符串unsigned long inet_addr(const char FAR * cp)该函数将一个点分十函数将一个点分十进制制IP地址字符串地址字符串转换成成32位数字表示的位数字表示的IP地址。地址。两函数互

42、两函数互为反函数反函数49字节序转换函数字节序转换函数u_long htonl( u_long hostlong )u4字字节主机字主机字节序表示的整数序表示的整数转换为4字字节相相应的网的网络字字节序表示的整数序表示的整数u_short htons( u_short hostshort )u2字字节主机字主机字节序表示的整数序表示的整数转换为2字字节相相应的网的网络字字节序表示的整数序表示的整数u_long ntohl( u_long netlong )u4字字节网网络字字节序表示的整数序表示的整数转换为4字字节相相应的主的主机字机字节序表示的整数序表示的整数u_short ntohs( u

43、_short netshort )u2字字节网网络字字节序表示的整数序表示的整数转换为2字字节相相应的主的主机字机字节序表示的整数序表示的整数50终止使用终止使用Winsock-WSACleanup()函数函数当当应用程序不再使用用程序不再使用Winsock API中的任何函中的任何函数数时,必,必须调用用WSACleanup()将其从将其从Windows Socket的的实现中注中注销,以,以释放放为此此应用程序或用程序或DLL分配的任何分配的任何资源。源。int WSACleanup(void);函数函数说明:明:WSACleanup()函数是任何一个函数是任何一个Winsock应用程序在

44、最后必用程序在最后必须要要调用的函数。用的函数。在一个多在一个多线程的程的环境下,境下,WSACleanup()函数函数中止了中止了Windows Sockets在所有在所有线程上的操程上的操作作51高级网络编程高级网络编程APIMFC编程技程技术定定义了用于网了用于网络编程的程的Winsock类,类名名为CAsyncSocket;还定定义了一个派生于了一个派生于CAsyncSocket的的CSocket类。这两个两个类简单实用,用用,用户可以使用它可以使用它们来来实现自己的网自己的网络程序。程序。与前面的介与前面的介绍相似,使用相似,使用MFC的的Winsock类进行操作行操作时需要使用需要使用Winsock2.h、Winsock32.dll和和ws2_32.lib三个文件三个文件52

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 医学/心理学 > 基础医学

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