




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第3章 WindowsWindows环境的网络编程环境的网络编程1 1、UNIXUNIX套接字编程接口套接字编程接口2 2、套接字编程接口编程、套接字编程接口编程面向衔接:不对等面向衔接:不对等面向无衔接:对等面向无衔接:对等3 3、阻塞的概念及阻塞的处理方法、阻塞的概念及阻塞的处理方法第3章 WindowsWindows环境的网络编程环境的网络编程上节课回想上节课回想SendRecv第3章 WindowsWindows环境的网络编程环境的网络编程无衔接的对等方式无衔接的对等方式 第3章 WindowsWindows环境的网络编程环境的网络编程关于阻塞的问题关于阻塞的问题 效力器进程因调用效力
2、器进程因调用ACCEPT()ACCEPT()而被阻塞而被阻塞 当套接字过程不断处于等待时,该过当套接字过程不断处于等待时,该过程就被阻塞程就被阻塞第3章 WindowsWindows环境的网络编程环境的网络编程1 1、WinSock APIWinSock API及与及与Unix SocketUnix Socket的区别和联络的区别和联络2 2、WinSock APIWinSock API编程实例编程实例VC6.0 VC6.0 版本版本第3章 WindowsWindows环境的网络编程环境的网络编程 Winsock Winsock是一套开放的、支持多协议的是一套开放的、支持多协议的Windows
3、Windows下的网络编程接口,运用程序经过调用下的网络编程接口,运用程序经过调用Winsock APIWinsock API实现相互间的通讯,而实现相互间的通讯,而WinSock WinSock 利用下层的通讯协利用下层的通讯协议功能和操作系统调用实现实践的通讯任务。议功能和操作系统调用实现实践的通讯任务。 WinsockWinsock是比较底层的网络通讯接口,如今是比较底层的网络通讯接口,如今VCVC环环境曾经对该接口进展了封装。但要实现更灵敏的网境曾经对该接口进展了封装。但要实现更灵敏的网络通讯,必需在络通讯,必需在APIAPI层次上进展层次上进展WinSockWinSock编程。编程。
4、第3章 WindowsWindows环境的网络编程环境的网络编程图图3.1 3.1 网络运用进程利用网络运用进程利用WindockWindock进展通讯进展通讯 第3章 WindowsWindows环境的网络编程环境的网络编程 Windows Sockets Windows Sockets 规范是一套开放的、支持多规范是一套开放的、支持多种协议的种协议的WindowsWindows下的网络编程接口。从下的网络编程接口。从19911991年年到到19951995年,从年,从1.01.0版开展到版开展到2.0.82.0.8版,已成为版,已成为WindowsWindows网络编程的现实上的规范。网络
5、编程的现实上的规范。第3章 WindowsWindows环境的网络编程环境的网络编程1 1Windows Sockets 1.1Windows Sockets 1.1版本版本包含两个文件:包含两个文件:库函数定义文件库函数定义文件Winsock.hWinsock.h:定义了一切:定义了一切WinSock 1.1WinSock 1.1版本库函数的语法、相关的符号常量和数据构造。版本库函数的语法、相关的符号常量和数据构造。库函数实现文件库函数实现文件WINSOCK.DLLWINSOCK.DLL:库函数的实现。:库函数的实现。留意:留意:第一个文件属于开发工具的一部分,第一个文件属于开发工具的一部分
6、,第二个文件属于操作系统的一部分。第二个文件属于操作系统的一部分。第3章 WindowsWindows环境的网络编程环境的网络编程nWinSock 1.1 承继了Berkeley Sockets规范SocketSocketSendSendBindBindSendToSendToListenListenRecvRecvAcceptAcceptRecvFromRecvFromConnectConnectCloseSocketCloseSocket封锁套接字封锁套接字第3章 WindowsWindows环境的网络编程环境的网络编程HTONLHTONL3232位位GETPEERNAMEGETPEERN
7、AME获得套接字对方的网络地址获得套接字对方的网络地址HTONSHTONS1616位位GETSOCKNAMEGETSOCKNAME获得指定套接字的网络地址获得指定套接字的网络地址NTOHLNTOHL3232位位GETSOCKOPTGETSOCKOPT获得套接字属性选项获得套接字属性选项NTOHSNTOHS1616位位SETSOCKOPTSETSOCKOPT设置套接字属性选项设置套接字属性选项INET_ADDRINET_ADDRIOCTLSOCKETIOCTLSOCKET为套接字提供控制为套接字提供控制INET_NTOAINET_NTOASELECTSELECT同步多路复用同步多路复用第3章 W
8、indowsWindows环境的网络编程环境的网络编程n数据库函数表3.2n 获取网络上的某些信息,需求网络上的数据库来实现。函数见表3.2,六个采用getXbyY()的方式。gethostnamegethostname获取本机的规范主机名获取本机的规范主机名gethostbyname( ) gethostbyname( ) 前往给定主机名的主机信息前往给定主机名的主机信息gethostbyaddr( )gethostbyaddr( )根据根据IPIP地址前往主机信息地址前往主机信息getservbyname( )getservbyname( )前往效力器的协议名及相关效力信息前往效力器的协议
9、名及相关效力信息getservbyport( ) getservbyport( ) 前往给定端口号的协议名及相关效力信息前往给定端口号的协议名及相关效力信息getprotobyname( )getprotobyname( )根据协议名或其相关协议信息根据协议名或其相关协议信息getprotobynumber( ) getprotobynumber( ) 根据协议号获取相关协议信息根据协议号获取相关协议信息第3章 WindowsWindows环境的网络编程环境的网络编程nWinSock 1.1 WinSock 1.1 扩展了扩展了Berkeley SocketsBerkeley Sockets规
10、范规范 P62P62n WinSock 1.1 WinSock 1.1定义了一批新的库函数主要是异定义了一批新的库函数主要是异步操作函数,以步操作函数,以WSAWSA字符开头,提供对音讯驱动机制字符开头,提供对音讯驱动机制的支持,有效利用的支持,有效利用WindowsWindows多义务多线程的机制。多义务多线程的机制。n两个函数需求留意:两个函数需求留意:nWSAStartUpWSAStartUp:初始化:初始化Win Sockets DLLWin Sockets DLLnWSACleanUpWSACleanUp:撤销:撤销Win Sockets DLLWin Sockets DLL注册注册
11、第3章 WindowsWindows环境的网络编程环境的网络编程nWinSock 1.1WinSock 1.1只支持只支持TCP/IPTCP/IP协议栈协议栈n 因此因此WinSock 1.1WinSock 1.1只支持只支持InternetInternet通通讯域讯域第3章 WindowsWindows环境的网络编程环境的网络编程2 2WinSock 2.0WinSock 2.0 WinSock 2.0 WinSock 2.0与与1.11.1兼容,同时加强了许多功兼容,同时加强了许多功能:能:支持多种协议栈:添加了与底层协议栈的接口支持多种协议栈:添加了与底层协议栈的接口引入了重叠引入了重叠
12、I/OI/O的概念:处理阻塞的问题的概念:处理阻塞的问题重叠重叠I/OI/O: 当进程再执行代码时产生一个当进程再执行代码时产生一个I/OI/O恳求,操作恳求,操作系统会产生一个中断,让系统会产生一个中断,让CPUCPU去完成这个去完成这个I/OI/O恳恳求,等到完成以后,系统再次产生一个操作完求,等到完成以后,系统再次产生一个操作完成通知。成通知。第3章 WindowsWindows环境的网络编程环境的网络编程新功能:新功能:运用事件对象异步通知:处理阻塞的问题运用事件对象异步通知:处理阻塞的问题效力的质量效力的质量QOSQOS:基于衔接:基于衔接:WSAConnectWSAConnect函
13、数的函数的QOSQOS参数设置效力参数设置效力质量质量无衔接:无衔接: WSAConnectWSAConnect函数可以为指定的通讯规函数可以为指定的通讯规定特定的定特定的QOSQOS级别级别套接口组:套接口组:扩展的字节顺序转换例程扩展的字节顺序转换例程分散分散/ /聚集方式聚集方式I/OI/O新增了许多函数新增了许多函数第3章 WindowsWindows环境的网络编程环境的网络编程1 1套接口数据类型和该类型的错误前往值套接口数据类型和该类型的错误前往值 在在WinSockWinSock中定义了一个新的数据类型中定义了一个新的数据类型SOCKETSOCKET,用来代表套接字描画符。,用来
14、代表套接字描画符。 typedef u_int SOCKET;typedef u_int SOCKET; 可以取从可以取从0 0到到INVALID_SOCKET-1INVALID_SOCKET-1之间的恣之间的恣意值。意值。SocketSocketAccceptAcccept前往前往SocketSocket类型。假设为错误,那么为类型。假设为错误,那么为INVALID_SOCKETINVALID_SOCKET。第3章 WindowsWindows环境的网络编程环境的网络编程2 2错误代码的获得错误代码的获得在在UNIX UNIX 套接字规范中,假设函数执行时发生了错误,套接字规范中,假设函数执
15、行时发生了错误,会把错误代码放到会把错误代码放到errnoerrno变量中。变量中。在在WinsockWinsock中,错误代码由中,错误代码由WSAGetLastError()WSAGetLastError()调用调用得到。得到。P72)P72)3 3指针指针(FAR (FAR 与与 near)near) 一切运用程序与一切运用程序与Windows SocketsWindows Sockets运用的指针都运用的指针都必需是必需是FARFAR指针指针. .长指针数据类型长指针数据类型LPHOSTENT= struct LPHOSTENT= struct hostent FAR hostent
16、FAR struct hostent FAR struct hostent FAR * *lpHostEntlpHostEnt;lpHostEnt = gethostbyname (szHostName)lpHostEnt = gethostbyname (szHostName)第3章 WindowsWindows环境的网络编程环境的网络编程4 4重命名的函数重命名的函数close()close()改动为改动为closesocket()closesocket()ioctl()ioctl()改动为改动为ioctlsocket()ioctlsocket()5 5WinsockWinsock支持的最
17、大套接口数目支持的最大套接口数目 在在WINSOCK.HWINSOCK.H中缺省值是中缺省值是6464,在编译时由常量,在编译时由常量FD_SETSIZEFD_SETSIZE决议。决议。6 6头文件头文件 WinSockWinSock运用程序只需包含运用程序只需包含WINSOCK.HWINSOCK.H。第3章 WindowsWindows环境的网络编程环境的网络编程7 7WinsockWinsock规范对于音讯驱动机制的支持规范对于音讯驱动机制的支持异步选择机制:异步选择机制:WSAAsyncSelect()WSAAsyncSelect()函数获取感兴趣的函数获取感兴趣的事件事件异步恳求函数:
18、以异步方式获得恳求信息异步恳求函数:以异步方式获得恳求信息WSAAsyncGetXByYWSAAsyncGetXByY阻塞处置方法:利用钩子函数检测进程能否被阻塞,阻塞处置方法:利用钩子函数检测进程能否被阻塞,用用WSACallBlockingCallWSACallBlockingCall取消阻塞取消阻塞错误处置:错误处置:WSAGetLastErrorWSAGetLastError启动和终止:启动和终止: WSAStartUpWSAStartUp,WSACleanUpWSACleanUp第3章 WindowsWindows环境的网络编程环境的网络编程第3章 WindowsWindows环境的
19、网络编程环境的网络编程1 1初始化函数初始化函数WSAStartup()WSAStartup() Winsock Winsock 运用程序必需首先调用运用程序必需首先调用WSAStartup( )WSAStartup( )函数对函数对WinsockWinsock进展初始化。初始化也称为注册。注进展初始化。初始化也称为注册。注册胜利后,才干调用其他的册胜利后,才干调用其他的Winsock APIWinsock API函数。函数。WSAStartup()WSAStartup()函数的调用格式函数的调用格式 int WSAStartup( int WSAStartup( WORD wVersionR
20、equested, WORD wVersionRequested, LPWSADATA lpWSAData );LPWSADATA lpWSAData );第3章 WindowsWindows环境的网络编程环境的网络编程uWSAStartup()WSAStartup()函数的初始化过程图函数的初始化过程图3.23.2u查找查找Winsock.dllWinsock.dll并加载入内存并加载入内存u检查检查WinsockWinsock能否可用确认版本号,随操作系能否可用确认版本号,随操作系统不同而不同统不同而不同u建立建立WinsockWinsock与运用程序的联络,分配资源,与运用程序的联络,分
21、配资源,DLLDLL内置援用计数加内置援用计数加1 1u函数前往胜利时,那么在参数函数前往胜利时,那么在参数lpWSAData lpWSAData 中包含中包含其支持的最高版本其支持的最高版本第3章 WindowsWindows环境的网络编程环境的网络编程图图3.2 3.2 在一台计算机中,运用同一在一台计算机中,运用同一WindockWindock实现的多个网络运用程序实现的多个网络运用程序 LoadLibraryLoadLibrary第3章 WindowsWindows环境的网络编程环境的网络编程uWSADATAWSADATA构造的定义构造的定义u#define WSADESCRIPTIO
22、N_LEN #define WSADESCRIPTION_LEN 256256u#define WSASYS_STATUS_LEN #define WSASYS_STATUS_LEN 128128utypedef struct WSAData typedef struct WSAData u WORD WORDwVersion;wVersion;u WORD WORDwHighVersion;wHighVersion;u char charszDescriptionWSADESCRIPTION_LEszDescriptionWSADESCRIPTION_LEN+1;N+1;u char cha
23、rszSystemStatusWSASYS_STATUS_LEszSystemStatusWSASYS_STATUS_LEN+1;N+1;u unsigned short unsigned short iMaxSockets;iMaxSockets;u unsigned short unsigned short iMaxUdpDg;iMaxUdpDg;u char char * *lpVendorInfo;lpVendorInfo;u WSADATA; WSADATA; 第3章 WindowsWindows环境的网络编程环境的网络编程u初始化函数能够前往的错误代码初始化函数能够前往的错误代码u
24、WSASYSNOTREADYWSASYSNOTREADY:网络通讯依赖的网络子:网络通讯依赖的网络子系统没有预备好。系统没有预备好。uWSAVERNOTSUPPORTEDWSAVERNOTSUPPORTED:找不到所需的:找不到所需的Winsock APIWinsock API相应的动态衔接库。相应的动态衔接库。uWSAEINVALWSAEINVAL:DLLDLL不支持运用程序所需的不支持运用程序所需的WinsockWinsock版本。版本。uWSAEINPROGRESSWSAEINPROGRESS:正在执行一个阻塞的:正在执行一个阻塞的Winsock 1.1Winsock 1.1操作。操作。
25、uWSAEPROCLIMWSAEPROCLIM:曾经到达:曾经到达WinsockWinsock支持的义支持的义务数上限。务数上限。uWSAEFAULTWSAEFAULT:参数:参数lpWSADatalpWSAData不是合法指针。不是合法指针。第3章 WindowsWindows环境的网络编程环境的网络编程u初始化初始化WinsockWinsock的例如的例如u#include #include uaa() aa() u u WORD wVersionRequested; / WORD wVersionRequested; /程序所需的程序所需的WinsockWinsock版本号版本号u WS
26、ADATA wsaData; / WSADATA wsaData; / 前往前往Winsock Winsock 实现的实现的细节信息细节信息u Int err; / Int err; / 出错代码出错代码u wVersionRequested =MAKEWORD(1,1); / wVersionRequested =MAKEWORD(1,1); / 生生成版本号成版本号u第3章 WindowsWindows环境的网络编程环境的网络编程/ / 调用初始化函数。调用初始化函数。 err = WSAStartup(wVersionRequested, &wsaData );err = WSA
27、Startup(wVersionRequested, &wsaData );if (err!=0 ) return; / / if (err!=0 ) return; / / 找不到适宜的找不到适宜的DLLDLL文件。文件。/ / 确认前往的版本号是客户要求的确认前往的版本号是客户要求的1.11.1if ( LOBYTE(wsaData.wVersion )!=1 | if ( LOBYTE(wsaData.wVersion )!=1 | HYBYTE(wsaData.wVersion )!=1) HYBYTE(wsaData.wVersion )!=1) WSACleanup();
28、return; WSACleanup(); return; / /* * 至此,可以确认初始化胜利,至此,可以确认初始化胜利,Winsock.DLLWinsock.DLL可用。可用。 第3章 WindowsWindows环境的网络编程环境的网络编程几个几个VCVC函数阐明函数阐明1 1、MakewordMakeword函数函数 将两个将两个bytebyte型合并成一个型合并成一个wordword型,不是型,不是相加,而是一个在高相加,而是一个在高8 8位,一个在低位,一个在低8 8位位2 2、LOBYTELOBYTE 获得双字节中最低最右边字节的内获得双字节中最低最右边字节的内容容 3 3、H
29、IBYTEHIBYTE 获得双字节中最高最左边字节的内获得双字节中最高最左边字节的内容容 第3章 WindowsWindows环境的网络编程环境的网络编程2 2注销函数注销函数WSACleanup( )WSACleanup( ) 程序运用完程序运用完Winsock.DLLWinsock.DLL提供的效力后,提供的效力后,运用程序必需调用运用程序必需调用WSACleanup()WSACleanup()函数:函数:解除与解除与Winsock.DLLWinsock.DLL库的绑定库的绑定内置援用计数减内置援用计数减1 1 释放释放WinsockWinsock分配给运用程序的系统资源分配给运用程序的系
30、统资源中止对中止对Windows Sockets DLLWindows Sockets DLL的运用的运用 int WSACleanup ( void ); int WSACleanup ( void ); 第3章 WindowsWindows环境的网络编程环境的网络编程1 1WSAGetLastError()WSAGetLastError()函数函数方式:方式:int WSAGetLastError ( void )int WSAGetLastError ( void ) 前往本线程进展的上一次前往本线程进展的上一次WinsockWinsock函数调用时的函数调用时的错误代码。错误代码。2
31、2WSASetLastError()WSASetLastError()函数函数方式:方式:void WSASetLastError ( int iError )void WSASetLastError ( int iError ) 允许运用程序为当前线程设置错误代码,并可允许运用程序为当前线程设置错误代码,并可由后来的由后来的WSAGetLastError()WSAGetLastError()调用前往。调用前往。第3章 WindowsWindows环境的网络编程环境的网络编程3 3、错误代码列表:、错误代码列表:P72-P74P72-P74自定义函数实现错误提示自定义函数实现错误提示: : V
32、oid ShowError()Void ShowError() int err; int err; err=WSAGetLastError(); err=WSAGetLastError(); case err case err WSANOTINITIAISED: print( WSANOTINITIAISED: print(“没有注册没有注册DLLDLL);); WSAENDDOWN: print( WSAENDDOWN: print(“网络子系统曾经失效网络子系统曾经失效);); 第3章 WindowsWindows环境的网络编程环境的网络编程1 1、创建套接口、创建套接口SOCKET()S
33、OCKET()方式:方式: SOCKET socket (SOCKET socket (int af, int af, int type,int type,int protocol);int protocol);举例:举例:/ /* * 创建一个流式套接字。创建一个流式套接字。SOCKET sockfd=SOCKET( AF_INET, SOCK_STREAM, SOCKET sockfd=SOCKET( AF_INET, SOCK_STREAM, 0); 0); / /* * 创建一个数据报套接字。创建一个数据报套接字。SOCKET sockfd=SOCKET( AF_INET, SOCK_
34、DGRAM, 0); SOCKET sockfd=SOCKET( AF_INET, SOCK_DGRAM, 0); 第3章 WindowsWindows环境的网络编程环境的网络编程2 2将套接口绑定到指定的网络地址将套接口绑定到指定的网络地址BIND( )BIND( )int bind( int bind( SOCKET s, SOCKET s, const struct sockaddr const struct sockaddr * * name, name, int namelen);int namelen);相关的三种相关的三种WinsockWinsock地址构造地址构造 有许多函数都
35、需求套接字的地址信息,有许多函数都需求套接字的地址信息,WinsockWinsock也定义了三种关于地址的构造,经常也定义了三种关于地址的构造,经常运用。运用。第3章 WindowsWindows环境的网络编程环境的网络编程通用的通用的WinsockWinsock地址构造,针对各种通讯域的套接地址构造,针对各种通讯域的套接字,存储它们的地址信息。字,存储它们的地址信息。struct sockaddr struct sockaddr u_short sa_family; /u_short sa_family; /* * 地址家族地址家族char sa_data14; /char sa_data1
36、4; /* * 协议地址协议地址 第3章 WindowsWindows环境的网络编程环境的网络编程专门针对专门针对Internet Internet 通讯域的通讯域的WinsockWinsock地址构造地址构造struct sockaddr_in struct sockaddr_in short sin_family; / short sin_family; /* * 指定地址家族,指定地址家族,AF_INET.AF_INET. u_short sin_port; / u_short sin_port; /* * 指定分配给套接字层指定分配给套接字层端口号端口号, , struct in_ad
37、dr sin_addr; / struct in_addr sin_addr; /* * 指定套接字的主指定套接字的主机的机的IPIP char sin_zero8; / char sin_zero8; /* * 全置为全置为0 0,是一个,是一个填充数。填充数。 第3章 WindowsWindows环境的网络编程环境的网络编程公用于存储公用于存储IPIP地址的构造地址的构造Struct in_addr Struct in_addr Union Union Struct u_char s_b1,s_b2,s_b3,s_b4; S_un_b; Struct u_char s_b1,s_b2,s_
38、b3,s_b4; S_un_b; Struct u_short s_w1,s_w2; S_un_w; Struct u_short s_w1,s_w2; S_un_w; U_long S_addr; U_long S_addr; UnionUnion结合运用了内存覆盖技术。结合运用了内存覆盖技术。第3章 WindowsWindows环境的网络编程环境的网络编程 in_addr in_addr中是一个中是一个unionunion,意思是这个构造的大,意思是这个构造的大小为小为4 4个字节,可以用个字节,可以用3 3种方法来访问:种方法来访问:当作一个当作一个u_longu_longS_addrS
39、_addr当作当作2 2个个u_shortu_shortS_un_w.s_w1S_un_w.s_w1S_un_w.s_w2S_un_w.s_w2或或4 4个个u_charu_charS_un_b.s_b1S_un_b.s_b1S_un_b.s_b2S_un_b.s_b2S_un_b.s_b3S_un_b.s_b3S_un_b.s_b4 S_un_b.s_b4 第3章 WindowsWindows环境的网络编程环境的网络编程 在运用在运用Internet Internet 域的套接字时,这三个域的套接字时,这三个数据构造的普通用法是:数据构造的普通用法是:定义一个定义一个Sockaddr_in
40、Sockaddr_in 的构造实例变量,并的构造实例变量,并将它清零;将它清零;为这个构造的各成员变量赋值;为这个构造的各成员变量赋值;在调用在调用BIND()BIND()绑定函数时,将指向这个构造绑定函数时,将指向这个构造的指针强迫转换为的指针强迫转换为 sockaddrsockaddr* *类型。类型。第3章 WindowsWindows环境的网络编程环境的网络编程举例:举例:SOCKET serSock;SOCKET serSock;sockaddr_in my_addr; sockaddr_in my_addr; int err; int err; int slen=sizeof( s
41、ockaddr); int slen=sizeof( sockaddr); serSock = SOCKET(AF_INET, SOCK_DGRAM,0 ); serSock = SOCKET(AF_INET, SOCK_DGRAM,0 ); memset(my_addrmemset(my_addr,0); 0); my_addr.sin_family = AF_INET; my_addr.sin_family = AF_INET; my_addr.sin_port = htons(21); my_addr.sin_port = htons(21); 第3章 WindowsWindows环境的
42、网络编程环境的网络编程my_addr.sin_addr.s_addr = inet_addr(202.193.96.32); my_addr.sin_addr.s_addr = inet_addr(202.193.96.32); 或者:或者:my_addr.sin_addr.S_un_b.s_b1=202my_addr.sin_addr.S_un_b.s_b1=202my_addr.sin_addr.S_un_b.s_b2=193my_addr.sin_addr.S_un_b.s_b2=193my_addr.sin_addr.S_un_b.s_b3=96my_addr.sin_addr.S_u
43、n_b.s_b3=96my_addr.sin_addr.S_un_b.s_b4=32 my_addr.sin_addr.S_un_b.s_b4=32 if (BIND(serSock, (LPSOCKADDR )&my_addr, if (BIND(serSock, (LPSOCKADDR )&my_addr, slen) = SOCKET_ERROR ) slen) = SOCKET_ERROR ) err = WSAGetLastError();err = WSAGetLastError(); 第3章 WindowsWindows环境的网络编程环境的网络编程3 3启动效力器
44、监听启动效力器监听LISTEN()LISTEN()效力器端效力器端格式:格式:int listen( int listen( SOCKET s, SOCKET s, int backlog);int backlog);功能:侦听客户端的衔接,正确前往功能:侦听客户端的衔接,正确前往0 0错误代码:错误代码: WSAGetLastError WSAGetLastError函数处置函数处置Listen(Sock,5);Listen(Sock,5);Err=WSAGetLastErrorErr=WSAGetLastError; ;Case Err Case Err 第3章 WindowsWindow
45、s环境的网络编程环境的网络编程4 4接纳衔接恳求接纳衔接恳求ACCEPT( )ACCEPT( )效力器端效力器端格式:格式:SOCKET accept( SOCKET accept( SOCKET s, SOCKET s, struct sockaddrstruct sockaddr* * addr, addr, intint* * addrlen); addrlen);功能:接纳衔接恳求,正确那么建立套接字功能:接纳衔接恳求,正确那么建立套接字错误代码:错误代码: WSAGetLastError WSAGetLastError函数处置函数处置Accept(Sock, addr,sizeof(
46、addr );Accept(Sock, addr,sizeof(addr );Err=WSAGetLastErrorErr=WSAGetLastError; ;Case Err Case Err 第3章 WindowsWindows环境的网络编程环境的网络编程5 5恳求衔接恳求衔接CONNECT()CONNECT()客户端客户端格式:格式:int connect( int connect( SOCKET s, SOCKET s, struct sockaddr struct sockaddr * * name, name, int namelen); int namelen); 功能:衔接效力
47、器,正确前往功能:衔接效力器,正确前往0 0错误代码:错误代码: WSAGetLastError WSAGetLastError函数处置函数处置Connect(Sock, addr,sizeof(addr );Connect(Sock, addr,sizeof(addr );Err=WSAGetLastErrorErr=WSAGetLastError; ;Case Err Case Err 第3章 WindowsWindows环境的网络编程环境的网络编程举例举例struct sockaddr_in daddr;struct sockaddr_in daddr;memset(voidmemset
48、(void * *)&daddr,0,sizeof(daddr);)&daddr,0,sizeof(daddr);daddr.sin_family=AF_INET;daddr.sin_family=AF_INET;daddr.sin_port=htons(8888);daddr.sin_port=htons(8888);daddr.sin_addr.s_addr=inet_addr(133.197.22.4daddr.sin_addr.s_addr=inet_addr(133.197.22.4););connect(ClientSocket,(LPSOCKADDR connec
49、t(ClientSocket,(LPSOCKADDR * *)&daddr,)&daddr,sizeof(daddr);sizeof(daddr);第3章 WindowsWindows环境的网络编程环境的网络编程6 6、发送数据、发送数据SendSend方式:方式:int send( int send( SOCKET s, SOCKET s, charchar* * buf, buf, int len, int len, int flags);int flags);功能:向对方发送数据,正确那么前往实践功能:向对方发送数据,正确那么前往实践发送的字节数发送的字节数错误代码:错误
50、代码: WSAGetLastErrorWSAGetLastError函数处置函数处置第3章 WindowsWindows环境的网络编程环境的网络编程留意:留意:假设是数据报套接字,那么发送的数据大小假设是数据报套接字,那么发送的数据大小不能超越通讯子网的最大不能超越通讯子网的最大IPIP包长度;包长度; 数据报的包最大长度在数据报的包最大长度在WSAStartUp( )WSAStartUp( )函函数前往,值为数前往,值为 iMaxUdpDg;iMaxUdpDg;下层缓冲区空间不够保管需求发送的数据,下层缓冲区空间不够保管需求发送的数据,那么那么SendSend函数能够阻塞;函数能够阻塞;第3
51、章 WindowsWindows环境的网络编程环境的网络编程阻塞阻塞错误错误阻塞阻塞第3章 WindowsWindows环境的网络编程环境的网络编程int recv( SOCKET s, char int recv( SOCKET s, char * * buf, int len, int flags); buf, int len, int flags);图图3-43-4阐明了阐明了sendsend和和recvrecv的作用,套接字缓冲区与运用进程的作用,套接字缓冲区与运用进程缓冲区的关系,以及协议栈所作的传送。缓冲区的关系,以及协议栈所作的传送。 图图3.4 Send()3.4 Send()
52、和和Recv()Recv()都是对本地套接字的操作都是对本地套接字的操作 第3章 WindowsWindows环境的网络编程环境的网络编程8 8按照指定目的地向数据报套接字发送数据按照指定目的地向数据报套接字发送数据SENDTO()SENDTO()int sendto( SOCKET s, char int sendto( SOCKET s, char * * buf, int len, int buf, int len, int flags, struct sockaddr flags, struct sockaddr * * to, int tolen); to, int tolen);9
53、 9接纳一个数据报并保管源地址,从数据报套接字接纳数接纳一个数据报并保管源地址,从数据报套接字接纳数据据RECVFORM()RECVFORM()int recvfrom( SOCKET s, char int recvfrom( SOCKET s, char * * buf, int len, int buf, int len, int flags, struct sockaddrflags, struct sockaddr* * from, int from, int* * fromlen); fromlen);1010封锁套接字封锁套接字CLOSESOCKET()CLOSESOCKET()
54、int closesocket( SOCKET s);int closesocket( SOCKET s);1111制止在一个套接口上进展数据的接纳与发送制止在一个套接口上进展数据的接纳与发送SHUTDOWN()SHUTDOWN()int shutdown( SOCKET s, int how); int shutdown( SOCKET s, int how); 第3章 WindowsWindows环境的网络编程环境的网络编程1 1WinsockWinsock中的字节顺序转换函数中的字节顺序转换函数图图3-5 3-5 两种本机字节顺序两种本机字节顺序 第3章 WindowsWindows环境
55、的网络编程环境的网络编程Winsock APIWinsock API特为此设置了四个函数:特为此设置了四个函数:、htonl() htonl() 函数函数 功能:将主机的无符号长整型数本机顺序转功能:将主机的无符号长整型数本机顺序转换为网络字节顺序换为网络字节顺序 ,用于,用于IPIP地址。地址。方式:方式:u_long PASCAL FAR htonl( u_long u_long PASCAL FAR htonl( u_long hostlong); hostlong); hostlonghostlong:主机字节顺序表达的:主机字节顺序表达的3232位数。位数。htonl()htonl(
56、)前往一个网络字节顺序的值。前往一个网络字节顺序的值。第3章 WindowsWindows环境的网络编程环境的网络编程、htons( )htons( )函数函数 功能:将主机的无符号短整型数转换成网络字功能:将主机的无符号短整型数转换成网络字节顺序,用于端口号。节顺序,用于端口号。方式:方式:u_short PASCAL FAR htons( u_short u_short PASCAL FAR htons( u_short hostshort);hostshort);hostshorthostshort:主机字节顺序表达的:主机字节顺序表达的1616位数位数htons()htons()前往一
57、个网络字节顺序的值前往一个网络字节顺序的值第3章 WindowsWindows环境的网络编程环境的网络编程、ntohl( )ntohl( )函数函数功能:将一个无符号长整型数从网络字节顺序功能:将一个无符号长整型数从网络字节顺序转换为主机字节顺序,用于转换为主机字节顺序,用于IPIP地址。地址。方式:方式:u_long PASCAL FAR ntohl( u_long u_long PASCAL FAR ntohl( u_long netlong); netlong); NetlongNetlong:是一个以网络字节顺序表达的:是一个以网络字节顺序表达的3232位数位数ntohl()ntohl
58、()前往一个以主机字节顺序表达的数前往一个以主机字节顺序表达的数第3章 WindowsWindows环境的网络编程环境的网络编程、ntohs( )ntohs( )函数函数功能:将一个无符号短整型数从网络字节顺序转换为功能:将一个无符号短整型数从网络字节顺序转换为主机字节顺序,用于端口号。主机字节顺序,用于端口号。方式:方式:u_short PASCAL FAR ntohs( u_short u_short PASCAL FAR ntohs( u_short netshort);netshort);netshortnetshort:是一个以网络字节顺序表达的:是一个以网络字节顺序表达的1616位
59、数位数ntohs( )ntohs( )前往一个以主机字节顺序表达的数前往一个以主机字节顺序表达的数第3章 WindowsWindows环境的网络编程环境的网络编程2 2获取与套接口相连的端地址获取与套接口相连的端地址GETPEERNAME()GETPEERNAME()int getpeername( SOCKET s, struct sockaddr int getpeername( SOCKET s, struct sockaddr * * name, name, int int * * namelen); namelen);3 3获取一个套接口的本地名字获取一个套接口的本地名字GETSOC
60、KNAME()GETSOCKNAME()int getsockname( SOCKET s, struct sockaddr int getsockname( SOCKET s, struct sockaddr * * name, name, int int * * namelen); namelen);4 4将一个点分十进制方式的将一个点分十进制方式的IPIP地址转换成一个长整型数地址转换成一个长整型数INET_ADDR()INET_ADDR()unsigned long inet_addr (const char unsigned long inet_addr (const char * * cp); cp);5 5将网络地址转换成点分十进制的字
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 安全施工规范课件
- 官方的购房合同2篇
- 农业碳汇项目碳排放权交易市场潜力与2025年政策建议报告
- 农业碳汇项目碳排放权交易市场交易主体行为与市场发展研究
- 理想信念主题课件
- 电气工程专项方案(3篇)
- 农业温室项目2025年投资策略与风险防范研究报告
- 广西启点工程咨询服务有限公司45t-h循环流化床锅炉技改项目变更(非辐射类)环境影响报告表
- 房屋屋面改造工程方案(3篇)
- 农业气象服务在设施农业中的应用效果评价报告
- 带状疱疹诊疗指南课件
- 肩关节脱位的治疗讲课件
- 极地车辆轻量化复合材料结构-洞察阐释
- 婴幼儿托育专业教学标准(中等职业教育)2025修订
- 劳务外包工安全管理制度
- 2025-2030中国对香豆酸市场发展形势与未来趋势研究报告
- 体育政策法规课件
- 2025年《畜禽屠宰生产企业事故隐患内部报告奖励制度》(修订版)
- DB62T 4342-2021 涉路工程安全评价技术规范
- 医院实验室生物安全委员会文件
- 供应室消毒员培训课件
评论
0/150
提交评论