资源预览内容
第1页 / 共17页
第2页 / 共17页
第3页 / 共17页
第4页 / 共17页
第5页 / 共17页
第6页 / 共17页
第7页 / 共17页
第8页 / 共17页
第9页 / 共17页
第10页 / 共17页
亲,该文档总共17页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
网络软件设计网络软件设计套接字接口函数套接字接口函数段景山段景山2socket 函数调用函数调用socket( )socket( )bind( )bind( )listen( )listen( )accept( )accept( )recv( )recv( )send( )send( )closesocket( )closesocket( )recvfrom( )recvfrom( )sendto( )sendto( )connect( )connect( )select( )select( )setsockopt( )setsockopt( )ioctlsocket( )ioctlsocket( )shutdown( )shutdown( )通信类通信类通信类通信类控制类控制类控制类控制类getpeername( )getpeername( )getsockname( )getsockname( )getsockopt( )getsockopt( )信息类信息类信息类信息类htonl( )htonl( )htons( )htons( )ntohl( )ntohl( )ntohs( )ntohs( )inet_addr( )inet_addr( ) inet_ntoa( )inet_ntoa( )辅助类辅助类辅助类辅助类段景山段景山3socket ( )SOCKET WSAAPI socket( IN int af,SOCKET WSAAPI socket( IN int af, IN int type, IN int type, IN int protocol) IN int protocol)SOCKETSOCKET类型就是类型就是类型就是类型就是int int 类型(见类型(见类型(见类型(见winsock.h winsock.h 中的定义)中的定义)中的定义)中的定义)WSAAPIWSAAPI:说明函数是:说明函数是:说明函数是:说明函数是Windows Socket ApplicationWindows Socket Application Application Programming Interface Application Programming Interface函数函数函数函数ININ:表示参数的作用是输入:表示参数的作用是输入:表示参数的作用是输入:表示参数的作用是输入OUTOUT:表示参数作用为输出:表示参数作用为输出:表示参数作用为输出:表示参数作用为输出段景山段景山4SOCKET socket( IN int af, IN int type, IN int protocol)SOCKET socket( IN int af, IN int type, IN int protocol)afaf:地址族类型,地址族类型,地址族类型,地址族类型,tcp/iptcp/ip使用使用使用使用AF_INETAF_INETsocket ( )typetype:套接字类型,套接字类型,套接字类型,套接字类型,SOCK_STREAMSOCK_STREAMSOCK_DGRAMSOCK_DGRAMSOCK_RAWSOCK_RAWSOCK_RDMSOCK_RDMSOCK_SEQPAKCETSOCK_SEQPAKCET默认情况下使用默认情况下使用默认情况下使用默认情况下使用TCPTCP协议协议协议协议默认情况下使用默认情况下使用默认情况下使用默认情况下使用UDPUDP协议协议协议协议数据直接封装在数据直接封装在数据直接封装在数据直接封装在IPIP分组内分组内分组内分组内功能:建立一个套接口结构,将其描述符交给调用者功能:建立一个套接口结构,将其描述符交给调用者功能:建立一个套接口结构,将其描述符交给调用者功能:建立一个套接口结构,将其描述符交给调用者protocolprotocol:协议号,一般设置为协议号,一般设置为协议号,一般设置为协议号,一般设置为0 0返回:套接字描述符返回:套接字描述符返回:套接字描述符返回:套接字描述符实验:测试实验:测试实验:测试实验:测试socketsocket()的各个参数,()的各个参数,()的各个参数,()的各个参数,如使用非常规的如使用非常规的如使用非常规的如使用非常规的afaf,typetype,protocolprotocol来测试来测试来测试来测试段景山段景山5bind ( )int bind ( IN SOCKET s, int bind ( IN SOCKET s, IN struct sockaddr * name, IN struct sockaddr * name, IN int namelen) IN int namelen)s: s: 套接字描述符套接字描述符套接字描述符套接字描述符namename:本地端点(套接字)地址结构指针:本地端点(套接字)地址结构指针:本地端点(套接字)地址结构指针:本地端点(套接字)地址结构指针namelennamelen:本地端点(套接字)地址结构大小:本地端点(套接字)地址结构大小:本地端点(套接字)地址结构大小:本地端点(套接字)地址结构大小功能:建立套接字和端点之间的关系确定功能:建立套接字和端点之间的关系确定功能:建立套接字和端点之间的关系确定功能:建立套接字和端点之间的关系确定“ “我是谁我是谁我是谁我是谁” ”返回:正确建立为返回:正确建立为返回:正确建立为返回:正确建立为0 0,否则为,否则为,否则为,否则为SOCKET_ERRORSOCKET_ERROR实验:能否在一个套接字描述符上两次绑定不同端点实验:能否在一个套接字描述符上两次绑定不同端点实验:能否在一个套接字描述符上两次绑定不同端点实验:能否在一个套接字描述符上两次绑定不同端点 能否在不同的套接字上绑定同一个端点能否在不同的套接字上绑定同一个端点能否在不同的套接字上绑定同一个端点能否在不同的套接字上绑定同一个端点段景山段景山6listen ( )int listenint listen(IN SOCKET sIN SOCKET s,IN int backlogIN int backlog)s: s: 套接字描述符套接字描述符套接字描述符套接字描述符backlog: backlog: 设置同时监听的连接个数,最好不设置为设置同时监听的连接个数,最好不设置为设置同时监听的连接个数,最好不设置为设置同时监听的连接个数,最好不设置为0 0, 目前最大为目前最大为目前最大为目前最大为5 5功能:设置套接字为监听模式。服务器模式功能:设置套接字为监听模式。服务器模式功能:设置套接字为监听模式。服务器模式功能:设置套接字为监听模式。服务器模式返回:设置成功为返回:设置成功为返回:设置成功为返回:设置成功为0 0,否则为,否则为,否则为,否则为SOCKET_ERRORSOCKET_ERROR实验:如何通过实验:如何通过实验:如何通过实验:如何通过backlogbacklog来限制同时接收的连接个数来限制同时接收的连接个数来限制同时接收的连接个数来限制同时接收的连接个数设计实验方案,预期的结果设计实验方案,预期的结果设计实验方案,预期的结果设计实验方案,预期的结果(1 1)段景山段景山7connect ( )int connetint connet(IN SOCKET sIN SOCKET s,IN struct sockaddr * name,IN struct sockaddr * name, IN int namelen IN int namelen)s: s: 套接字描述符套接字描述符套接字描述符套接字描述符namename:端点(套接字)地址结构指针:端点(套接字)地址结构指针:端点(套接字)地址结构指针:端点(套接字)地址结构指针namelennamelen:端点(套接字)地址结构大小:端点(套接字)地址结构大小:端点(套接字)地址结构大小:端点(套接字)地址结构大小功能:与服务器建立连接功能:与服务器建立连接功能:与服务器建立连接功能:与服务器建立连接返回:连接成功为返回:连接成功为返回:连接成功为返回:连接成功为0 0,不成功为,不成功为,不成功为,不成功为1 1实验:服务器的地址可以是实验:服务器的地址可以是实验:服务器的地址可以是实验:服务器的地址可以是INADDR_ANYINADDR_ANY吗?为什么吗?为什么吗?为什么吗?为什么? ? 连接前一定要绑定本地端点吗?连接前一定要绑定本地端点吗?连接前一定要绑定本地端点吗?连接前一定要绑定本地端点吗?段景山段景山8accept ( )SOCKET accept( IN SOCKET s,SOCKET accept( IN SOCKET s, OUT struct sockaddr * addr, OUT struct sockaddr * addr, IN OUT int * addrlen ) IN OUT int * addrlen )addraddr:远端点(套接字)地址结构指针:远端点(套接字)地址结构指针:远端点(套接字)地址结构指针:远端点(套接字)地址结构指针addrlenaddrlen:远端点(套接字)地址结构大小指针:远端点(套接字)地址结构大小指针:远端点(套接字)地址结构大小指针:远端点(套接字)地址结构大小指针s: s: 套接字描述符套接字描述符套接字描述符套接字描述符功能:接受一个对方调用功能:接受一个对方调用功能:接受一个对方调用功能:接受一个对方调用connectconnect()请求的连接。该连接将在()请求的连接。该连接将在()请求的连接。该连接将在()请求的连接。该连接将在返回的新套接字上完成返回的新套接字上完成返回的新套接字上完成返回的新套接字上完成返回:连接所在的新套接字描述符,不成功则为返回:连接所在的新套接字描述符,不成功则为返回:连接所在的新套接字描述符,不成功则为返回:连接所在的新套接字描述符,不成功则为1 1输出:输出:输出:输出:addr addr 远端点地址远端点地址远端点地址远端点地址addrlen addrlen 远端点地址结构大小远端点地址结构大小远端点地址结构大小远端点地址结构大小实验:实验:实验:实验:addraddr在调用前是否一定要填入内容,在调用前是否一定要填入内容,在调用前是否一定要填入内容,在调用前是否一定要填入内容,addrlenaddrlen呢?呢?呢?呢?思考:客户认为已建立连接是在之前还是之后?思考:客户认为已建立连接是在之前还是之后?思考:客户认为已建立连接是在之前还是之后?思考:客户认为已建立连接是在之前还是之后?段景山段景山9recv ( )int recv( IN SOCKET s, OUT char * buf, int recv( IN SOCKET s, OUT char * buf, IN int len, IN int flags) IN int len, IN int flags)s: s: 套接字描述符套接字描述符套接字描述符套接字描述符bufbuf:接收缓冲区的指针:接收缓冲区的指针:接收缓冲区的指针:接收缓冲区的指针lenlen:接收缓冲区大小:接收缓冲区大小:接收缓冲区大小:接收缓冲区大小思考:为什么要设置思考:为什么要设置思考:为什么要设置思考:为什么要设置lenlenflagsflags:接收方式,一般为:接收方式,一般为:接收方式,一般为:接收方式,一般为0 0。MSG_OOBMSG_OOB:读取:读取:读取:读取带外数据带外数据带外数据带外数据MSG_PEEKMSG_PEEK:数据:数据:数据:数据不从队列中取出不从队列中取出不从队列中取出不从队列中取出实验:实验:实验:实验:MSG_PEEKMSG_PEEK的作用的作用的作用的作用功能:从套接字接收数据,数据将放在功能:从套接字接收数据,数据将放在功能:从套接字接收数据,数据将放在功能:从套接字接收数据,数据将放在bufbuf所指的缓冲区内。通所指的缓冲区内。通所指的缓冲区内。通所指的缓冲区内。通过返回值,调用者可以获得真正接收的字节数。过返回值,调用者可以获得真正接收的字节数。过返回值,调用者可以获得真正接收的字节数。过返回值,调用者可以获得真正接收的字节数。返回:接收的字节数返回:接收的字节数返回:接收的字节数返回:接收的字节数输出:输出:输出:输出:bufbuf缓冲区内将填入接收的数据缓冲区内将填入接收的数据缓冲区内将填入接收的数据缓冲区内将填入接收的数据段景山段景山10send ( )int send( IN SOCKET s, IN char * buf, int send( IN SOCKET s, IN char * buf, IN int len, IN int flags) IN int len, IN int flags)s: s: 套接字描述符套接字描述符套接字描述符套接字描述符bufbuf:发送缓冲区的指针:发送缓冲区的指针:发送缓冲区的指针:发送缓冲区的指针lenlen:发送的字节数:发送的字节数:发送的字节数:发送的字节数flagsflags:发送方式,一般为:发送方式,一般为:发送方式,一般为:发送方式,一般为0 0。功能:从套接字发送数据,用户事先准备好数据,放在功能:从套接字发送数据,用户事先准备好数据,放在功能:从套接字发送数据,用户事先准备好数据,放在功能:从套接字发送数据,用户事先准备好数据,放在bufbuf里。里。里。里。返回:真正发送的字节数返回:真正发送的字节数返回:真正发送的字节数返回:真正发送的字节数思考:思考:思考:思考:lenlen的作用,和的作用,和的作用,和的作用,和recvrecv中的中的中的中的lenlen有什么区别有什么区别有什么区别有什么区别MSG_OOBMSG_OOB:发送带外数:发送带外数:发送带外数:发送带外数据据据据MSG_DONTROUTEMSG_DONTROUTE:数:数:数:数据外送时,不做路由选择据外送时,不做路由选择据外送时,不做路由选择据外送时,不做路由选择段景山段景山11recvfrom ( )int recvfrom( IN SOCKET s, OUT char * buf, IN int len,int recvfrom( IN SOCKET s, OUT char * buf, IN int len, IN int flags, OUT struct sockaddr * from, IN int flags, OUT struct sockaddr * from, IN OUT int * fromlen) IN OUT int * fromlen)s: s: 套接字描述符套接字描述符套接字描述符套接字描述符bufbuf:接收缓冲区的指针:接收缓冲区的指针:接收缓冲区的指针:接收缓冲区的指针lenlen:接收缓冲区大小:接收缓冲区大小:接收缓冲区大小:接收缓冲区大小flagsflags:接收方式,一般为:接收方式,一般为:接收方式,一般为:接收方式,一般为0 0。from:from:远端点结构指针远端点结构指针远端点结构指针远端点结构指针fromlenfromlen:远端点结构大小指针:远端点结构大小指针:远端点结构大小指针:远端点结构大小指针功能:在套接字接收数据,并捕获发送远端点地址。功能:在套接字接收数据,并捕获发送远端点地址。功能:在套接字接收数据,并捕获发送远端点地址。功能:在套接字接收数据,并捕获发送远端点地址。返回:接收的字节数返回:接收的字节数返回:接收的字节数返回:接收的字节数输出:输出:输出:输出:bufbuf缓冲区内将填入接收的数据缓冲区内将填入接收的数据缓冲区内将填入接收的数据缓冲区内将填入接收的数据fromfrom中将填入远端点信息中将填入远端点信息中将填入远端点信息中将填入远端点信息fromlenfromlen中将填入远端点结构大小中将填入远端点结构大小中将填入远端点结构大小中将填入远端点结构大小思考:和思考:和思考:和思考:和recvrecv有什么区别有什么区别有什么区别有什么区别段景山段景山12sendto ( )int sendto( IN SOCKET s, IN char * buf , IN int len, int sendto( IN SOCKET s, IN char * buf , IN int len, IN int flags, IN struct sockaddr * to, IN int tolen) IN int flags, IN struct sockaddr * to, IN int tolen)s: s: 套接字描述符套接字描述符套接字描述符套接字描述符bufbuf:发送缓冲区的指针:发送缓冲区的指针:发送缓冲区的指针:发送缓冲区的指针lenlen:发送的字节数:发送的字节数:发送的字节数:发送的字节数flagsflags:发送方式,一般为:发送方式,一般为:发送方式,一般为:发送方式,一般为0 0。功能:从套接字发送数据,用户事先准备好数据,放在功能:从套接字发送数据,用户事先准备好数据,放在功能:从套接字发送数据,用户事先准备好数据,放在功能:从套接字发送数据,用户事先准备好数据,放在bufbuf里。里。里。里。toto:远端点地址结构指针:远端点地址结构指针:远端点地址结构指针:远端点地址结构指针tolentolen:远端点地址结构大小:远端点地址结构大小:远端点地址结构大小:远端点地址结构大小返回:真正发送的字节数返回:真正发送的字节数返回:真正发送的字节数返回:真正发送的字节数思考:与思考:与思考:与思考:与sendsend的区别的区别的区别的区别在这些函数中为什么有些时候端点地址结构大小传值在这些函数中为什么有些时候端点地址结构大小传值在这些函数中为什么有些时候端点地址结构大小传值在这些函数中为什么有些时候端点地址结构大小传值而有些时候传指针?而有些时候传指针?而有些时候传指针?而有些时候传指针?段景山段景山13shutdown ( )int shutdown( IN SOCKET s, IN int howint shutdown( IN SOCKET s, IN int how)s: s: 套接字描述符套接字描述符套接字描述符套接字描述符howhow:断开连接方式:断开连接方式:断开连接方式:断开连接方式功能:可以三种方式断开连接功能:可以三种方式断开连接功能:可以三种方式断开连接功能:可以三种方式断开连接howhow为为为为0 0(SD_RECEIVESD_RECEIVE): : 套接字不再套接字不再套接字不再套接字不再提供提供提供提供接收数据接收数据接收数据接收数据服务服务服务服务howhow为为为为1 1(SD_SENDSD_SEND): : 套接字不再套接字不再套接字不再套接字不再提供提供提供提供发送数据发送数据发送数据发送数据服务服务服务服务howhow为为为为2 2(SD_BOTHSD_BOTH): : 套接字不再提供接收数据和发送套接字不再提供接收数据和发送套接字不再提供接收数据和发送套接字不再提供接收数据和发送注意,这将发出一个注意,这将发出一个注意,这将发出一个注意,这将发出一个FINFIN数据服务数据服务数据服务数据服务返回:正确执行为返回:正确执行为返回:正确执行为返回:正确执行为0, 0, 否则为否则为否则为否则为1 1实验:三种方式下的效果。实验:三种方式下的效果。实验:三种方式下的效果。实验:三种方式下的效果。段景山段景山14closesocket ( )int closesocketint closesocket( IN SOCKET sIN SOCKET s)s: s: 套接字描述符套接字描述符套接字描述符套接字描述符功能:关闭套接字,如果套接字上有连接,则连接也关闭了功能:关闭套接字,如果套接字上有连接,则连接也关闭了功能:关闭套接字,如果套接字上有连接,则连接也关闭了功能:关闭套接字,如果套接字上有连接,则连接也关闭了返回:成功为返回:成功为返回:成功为返回:成功为0 0。思考:思考:思考:思考:closesocketclosesocket与与与与shutdownshutdown的区别,本质区别的区别,本质区别的区别,本质区别的区别,本质区别段景山段景山小结小结n n以套接字以套接字为主关主关键参数参数l l所有的通信所有的通信所有的通信所有的通信类类和控制和控制和控制和控制类类函数函数函数函数n n关于地址关于地址结构构长度参数度参数l l有有有有时时候是形参,有候是形参,有候是形参,有候是形参,有时时是是是是实实参参参参uu有有有有时时是整型是整型是整型是整型变变量,有量,有量,有量,有时时是整型指是整型指是整型指是整型指针针uu有有有有时时是是是是输输入,有入,有入,有入,有时时是是是是输输出,有出,有出,有出,有时时是是是是输输入和入和入和入和输输出出出出n n关于套接字函数返回关于套接字函数返回值的的处理理l l通信程序是需要双方配合的,如果通信程序是需要双方配合的,如果通信程序是需要双方配合的,如果通信程序是需要双方配合的,如果对对方没有按照方没有按照方没有按照方没有按照预预想的配合,想的配合,想的配合,想的配合,应该应该有有有有应对应对措施。措施。措施。措施。l l应对应对措施之一,依靠函数措施之一,依靠函数措施之一,依靠函数措施之一,依靠函数错误错误返回返回返回返回值值,避免自己,避免自己,避免自己,避免自己的流程以的流程以的流程以的流程以错误错误的姿的姿的姿的姿态进态进入入入入15段景山段景山16关于错误处理关于错误处理套接字函数的返回值中,为套接字函数的返回值中,为套接字函数的返回值中,为套接字函数的返回值中,为0 0多数表示为成功执行多数表示为成功执行多数表示为成功执行多数表示为成功执行 为为为为1 1表示错误(表示错误(表示错误(表示错误(SOCKET_ERRORSOCKET_ERROR)在在在在windowswindows系统下,也可通过系统下,也可通过系统下,也可通过系统下,也可通过WSAGetLastErrorWSAGetLastError()来取得()来取得()来取得()来取得进一步的出错代号进一步的出错代号进一步的出错代号进一步的出错代号例:例:例:例:1 1if(bind(s,) = SOCKET_ERROR)if(bind(s,) = SOCKET_ERROR) error_num = WSAGetLastError( ); error_num = WSAGetLastError( ); 当出错以后,通过当出错以后,通过当出错以后,通过当出错以后,通过getsockoptgetsockopt()设置为()设置为()设置为()设置为SO_ERRORSO_ERROR来获得进来获得进来获得进来获得进一步的出错代号一步的出错代号一步的出错代号一步的出错代号if(bind(s,) = SOCKET_ERROR)if(bind(s,) = SOCKET_ERROR) getsockopt( s, SOL_SOCKET, SO_ERROR, getsockopt( s, SOL_SOCKET, SO_ERROR, &error_num, sizeof( error_num ) );&error_num, sizeof( error_num ) ); 例:例:例:例:2 2思考:获得思考:获得思考:获得思考:获得错误代码以错误代码以错误代码以错误代码以后,程序的后,程序的后,程序的后,程序的处理模式处理模式处理模式处理模式段景山段景山17关于错误处理关于错误处理错误代码:在错误代码:在错误代码:在错误代码:在winsock.hwinsock.h中查询中查询中查询中查询if(bind(s,) = SOCKET_ERROR)if(bind(s,) = SOCKET_ERROR) error_num = WSAGetLastError( ); error_num = WSAGetLastError( );switch( error_num )switch( error_num )case WSANOTINITIALISED:case WSANOTINITIALISED: deal with the problem; deal with the problem; break; break;case WSAEADDRINUSE:case WSAEADDRINUSE: deal with the problem; deal with the problem; break; break; 配合本部分内容完成实验配合本部分内容完成实验配合本部分内容完成实验配合本部分内容完成实验5 5
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号