版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第8章Windows网络编程8.1Winsock编程接口
8.2Windows与Linux网络编程环境的异同习题8.1Winsock编程接口
8.1.1Winsock的发展
Winsock(Windowssocket)是随着Windows的飞速发展而诞生的。最初,socket只是用于UNIX系统中,但Windows系统的发展使人们想到是否可以把它移植过来。于是,1993年就出现了Winsock1.0版本规范,这个版本定义了16位的网络编程接口。当然,它很快就不能适应32位的需要了,接着,1994年5月,Winsock2.0版本问世了。1997年5月,Winsock2.0的规范版本Winsock2.2.1正式发布。有了这个接口,程序员就可以很方便地编写符合Windows编程模式的软件,大大方便了网络程序的开发。接下来介绍一下Winsock的组成和使用。 8.1.2Winsock规范的组成及适用范围 因为Winsock是从UNIX系统中的socket得到的启发和利用,当然就少不了UNIX的一些特性。完成一个网络连接的信息主要有协议族、本地端口号、本地主机地址、远程端口号、远程主机地址、服务类型等,socket中必须包含这些信息才能完成连接。在Winsock2.0及以后的版本中均提供了标准服务提供接口(SPI,StandardServiceProviderInterface),如果系统安装了相应的协议后,则通过SPI,Winsock可以应用于很多的网络中。
对于网络应用程序的开发者来说,Winsock提供的开发组件包括WinsockAPI和一些头文件。对于网络通信的实现来说,Winsock提供的运行组件是WinsockAPI的动态链接库(DLL)。WinsockDLL有不同的版本,但它的使用对用户来说是透明的,用户不必关心不同版本之间的协商问题。
Winsock支持流socket和数据报socket,这两种类型的socket提供的数据流服务不同,前者提供面向连接的、可靠的、无重复的数据传输,内设流量控制机制;后者提供无连接的、不可靠的数据传输,没有流量控制机制,所以接收的数据可能和发送的数据顺序不一致。
就像网络通信需要协议的支持一样,网络程序的开发和使用也要有一定规则的支持,Winsock规范的初衷就是提供这样的支持。遵循这套规范开发的软件就被认为是Winsock兼容的。
8.1.3Winsock的主要特点 正如前面提到的,Winsock是从UNIX移植过来的,这就注定了它具有继承性,同时,它又是针对Windows系统而开发的,具有其扩展性。
熟悉UNIX系统的人在用到Winsock的时候会感到很亲切,因为它们都有相似的环境。在Winsock中使用的一些库函数都保留了BerkeleySocket的风格。Winsock的BSDSocketAPI函数都源自于UNIX系统。 随着Windows版本的更新,Winsock的版本也随之更新,由Winsock1.0、Winsock1.1到现在的Winsock2.2.1,其内容都是为了更好地适应用户在不同版本的Windows系统下使用。比较特殊的是WindowsCE只支持Winsock1.1版本,其他的Windows系统都可以适用最新的Winsock2.0以上的版本。
由于Winsock支持的Windows版本众多,其中既有单线程的,也有多线程的,因此在使用多线程时尤其要注意终止socket的工作。接下来我们就来看一下Winsock是如何开始和终止它的工作的。 8.1.4Winsock的启动和终止 前面已经介绍了使用一个socket的时候要先创建它,Winsock也是如此。这里介绍WSAStartup()函数和WSACleanup()函数。当一个Winsock应用程序启动时,首先要加载WinsockDLL,并且视不同的版本而加载不同的WinsockDLL,然后,我们就可以开始启动工作了。Winsock的实现依赖于它的库函数DLL,每一个Winsock应用程序首先都要调用WSAStartup()函数,成功启动该函数之后,应用程序就可以执行其他的Winsock API函数了。WSAStartup()函数的描述如下:
intPASCALFARWSAStartup(WORDwVersionRequested,LPWSADATA*lpWSAData);
其中各函数的含义为: ● PASCAL:使用PASCAL风格的函数; ● FAR:说明此函数所在的代码段可能和应用程序所在的代码段不同; ● wVersionRequested:指定WinsockAPI的版本号; ● lpWSAData:指向LPWSADATA数据结构的指针。 以下程序段形成WSADATA:
typedefstructWSAData{ WORDwVersion; WORDwHighVersion; charszDescription[WSAOESCRIPTION_LEN+1]; charszSystemStatus[WSASYS_STATUS_LEN+1]; unsignedshortiMaxSockets; unsignedshortiMaxUdpDg; charFAR*lpVendorInfo; }; WSAOESCRIPTION_LEN=256; WSASYS_STATUS_LEN=128; WSADATAFAR*LPWSADATA; ● wVersion:返回由wVersionRequested设置的版本号; ● wHighVersion:返回Winsock能兼容的最高版本号; ● szDescription:说明修订版本号等信息; ● szSystemStatus:返回特殊系统组合设置; ● iMaxSockets:在较低版本的Winsock中返回应用程序可以使用的最大版本号,Winsock2.0以上版本不再使用; ● iMaxUdpDg:在较低版本的Winsock中返回Winsock发送或接收的UDP数据最大长度,Winsock2.0以上版本不再使用; ● lpVendorInfo:在较低版本的Winsock中返回Winsock制造商信息,Winsock2.0以上版本不再使用。
应用程序可以视不同的需要多次读取WSAData结构信息,每一次读取都是对WSAStartup()函数的调用,在结束的时候必须调用同样次数的WSACleanup()函数,因为它们必须是成对出现的。WSACleanup()函数的描述如下:
intWSACleanup(void);
其中,void=0表示完成。 以下是调用WSAStartup()函数和WSACleanup()函数的示例:
/*socketversionrequested2.0*/ WORDversion=0x0002; WSADATAWSAData; /*
用来获取Windows套接字的具体实现信息
*/ /*获取当前套接字的信息,将结果保存在WSAData变量里
*/voidSocketmodel(void){intiReturn;iReturn=WSAStartup(Version,&WSAData); /*
获取版本信息
*/if(iReturn!=ERROR_SUCCESS){/*错误处理程序
*/cout<<"WindowsSocketisnotresponded.";}/*应用程序代码段
*/iReturn=WSACleanup();/*
进行所有的清除工作,并且终止所有的套接字操作线程
*/if(iReturn!=ERROR_SUCCESS){cout<<"WindowsSocketscannotbeclosed.";}else{cout<<"WindowsSocketsisclosed.";}}
为了实现安全的网络连接,我们在调用此函数之前,应该先调用shutdown()函数,关闭连接,然后再执行终止socket的工作,释放资源。并不是每一次调用的时候都释放资源,否则仍在使用该套接字的应用程序就会受到影响。实质上,最后一个调用的WSACleanup()函数才真正地释放资源,之前其他的调用只是在计数器上减少数量而已。 8.1.5WinsockAPI函数 在8.1.4节中我们已经接触到了Winsock的两个函数:WSAStartup()函数和WSACleanup()函数。本节将详细介绍WinsockAPI函数,了解各函数的定义、功能、参数设置及意义。 对于标准的socket函数,前面已经详细描述,这里不再详述,下面只介绍Winsock1.1专用函数和Winsock2扩展函数。 1.域名地址 在Internet上访问远程主机的时候,我们会输入IP地址或如这样的地址,但在Winsock中,这样的地址是不能被识别的,必须转换为socket地址结构。反之,socket数据结构的地址也必须转换为用户理解的形式。这种地址转换工作是由数据库函数实现的。这些函数通过访问各种数据库资源,获得域名、服务、协议等信息。在Winsock2.0以后的版本中,应用程序要使用其他函数实现(参见本章Winsock2扩展函数),此类函数只是为了兼容而保留了下来,但我们还是需要了解一下这些函数。具体函数描述如下: ● gethostbyaddr():根据网络地址获得域名或IP地址。
定义:
structhostentFAR*WSAAPI stcharFAR*addr,/*指向一个以网络字节顺序表示的32位网络地址指针
*/ INintlen,
/*addr的字节数
*/ INinttype); /*
地址类型
*/
函数根据网络地址获得远程主机信息,返回的信息包含在以下指针结构中:
structhostent{ charFAR*h_name; /*
返回主机名字
*/ charFAR*h_aliases; /*
返回主机别名,是一个以NULL结束的别名数组
*/ shorth_length; /*
返回地址的字节数
*/ charFAR*h_addr_list; /*
一个以NULL结束的地址表,以网络字节顺序表示
*/} structhostent{ charFAR*h_name; /*
返回主机名字
*/ charFAR*h_aliases; /*
返回主机别名,是一个以NULL结束的别名数组
*/ shorth_length; /*
返回地址的字节数
*/ charFAR*h_addr_list; /*
一个以NULL结束的地址表,以网络字节顺序表示
*/ } structhostent{ charFAR*h_name; /*
返回主机名字
*/ charFAR*h_aliases; /*
返回主机别名,是一个以NULL结束的别名数组
*/ shorth_length; /*
返回地址的字节数
*/ charFAR*h_addr_list; /*
一个以NULL结束的地址表,以网络字节顺序表示
*/} ● gethostbyname():根据主机名获得主机信息。 定义:
structhostentFAR*WSAAPI gethostbyname(INconstcharFAR*name); /*获得主机名字
*/
该函数返回一个hostent结构指针,包括主机名和地址信息。 以下是该函数调用的示例: voidResolveHostMsg(void) { charHostName[256]; /*
首先获取本地主机名称,将主机名保存在HostName里
*/ gethostname(HostName,sizeof(HostName)); /*
得到主机名,主机名长度
*/ ethostbyname(HostName); /*
通过函数gethostbyname取得的主机名和地址信息生成hostent结构
*/ if(Host==0){ /*如果主机名非法,则输出错误提示
*/ cout<<"IPError."; }else /*输出主机信息
*/ { cout<<Host->h_name<<endl; /*
输出主机名
*/
cout<<Host->h_alias<<endl; /*
输出主机别名
*/ cout<<Host->addrtype<<endl; /*
输出IP地址类型
*/ } } ● gethostname():在指定缓冲区中返回主机名。 定义:
intWSAAPI gethostname( OUTcharFAR*name,
/*指向接收主机名的缓冲区的指针
*/ INintnamelen /*缓冲区长度*/ };
以下是该函数调用的示例:
/*解析主机名,并将解析结果保存成AnsiString类型。AnsiString类是功能很强的字串类。AnsiString类构造器可以从Char、Char*、int或double生成AnsiString类对象。这些构造器很容易将直接字串赋予AnsiString类并将整数或浮点数变成字串
*/ AnsiStringResolveHostName(void){ charHostName[256]; /*首先获取本地主机名称,将主机名保存在HostName里
*/ gethostname(HostName,sizeof(HostName)); /*得到主机名,主机名长度
*/return(Strpas (HostName));/*将解析结果通过Strps()函数转化成指定的AnsiString类型,
并返回
*/}
以下是该函数调用的示例:AnsiStringGetProtol(AnsiStringProtocalName){Protoent*Protocol=getprotobyname(ProtocalName.c_strc);/*
定义一个Protoent类型的指针变量来保存获取的协议信息
*/if(Protocol!=0){/*
如果获取的协议合法,返回协议号:协议名称
*/return(IntToStr(Protocol->p_proto)+":"+StrPas(Protocol->p_name));/*
通过IntToStr函数将结果转化为字串类型
*/else{/*如果不合法,则返回0*/return(AnsiString)0;}}} ● getprotobynumber():通过协议号获得协议信息。 定义:
structprotoentFAR*WSAAPI getprotobynumber(INintnumber); /*
以主机字节顺序表示的协议号
*/
以下是该函数调用的示例:
/*获取协议
*/ voidGetProtocol(void){ /*获取协议,判断协议是否合法,并循环输出合法的协议号及对应的协议名称
*/ for(inti=1;i<=100;i++) {protoent*Protocol=getprotobynumber(i); if(Protocol!=0) cout<<Protocol->p_proto<<”:”<<Protocol->p_name<<endl; } } ● getservbyname():获得服务信息,包括服务名和服务端口号。它通过给定服务名和协议名获得。
定义:
structserventFAR*WSAAPI getservbyname(INconstcharFAR*name,
/*指向服务的指针
*/INconstcharFAR*proto); /*指向协议名的指针
*/
返回的信息包含在以下指针结构中:
structservent{
charFAR*s_name; /*
服务正式名
*/ charFAR*FAR*s_aliases; /*
服务别名
*/ shorts_port; /*
以网络字节顺序表示的服务端口号
*/ charFAR*s_proto /*
连接时所用到的协议名
*/ }; ● getservbyport():获得服务信息,包括服务名和服务端口号。与getservbyname不同的是它通过给定端口号和协议名获得。 定义:
structserventFAR*WSAAPI getservbyport( INintport,
/*以网络字节顺序表示的服务使用的端口号
*/INconstcharFAR*proto /*指向协议名的指针*/ );以下是该函数调用的示例:voidGetServent(intPort,
char*ProtoName){servent*Serv=getservbyname(Port,
ProtoName);if(Serv!=0){ /*输出通信协议服务相关信息
*/cout<<Serv->s_name<<endl; /*协议服务名称
*/cout<<Serv->s_port<<endl; /*协议服务端口号
*/cout<<Serv->s_proto<<endl; /*协议号
*/}} 2.Winsock1.1专用函数
Winsock1.1对BerkeleySocket标准函数的扩充主要是实现对网络事件基于消息的异步存取。根据实现功能的不同,可以将这些函数分为以下五类:
1)启动和终止函数
WSAStartup()函数和WSACleanup()函数,前面我们已经介绍过,这里不再赘述。
2)异步服务函数 在BerkeleySockets标准函数中,请求服务是阻塞的,在Winsock中,这些函数可以实现应用程序异步获取请求信息,并在服务完成后返回一个应答消息。这类函数主要有: ● WSAAsyncGetHostByAddr():通过网络地址获得主机名字和地址信息。
定义:
HANDLEWSAAPI/*初始化成功后返回一个HANDLE类型的非零值*/ WSAAsyncGetHostByAddr( INHWNDhWnd,
/*请求完成时,接收消息的窗口句柄
*/INunsignedintwMsg,
/*请求完成时接收到的消息
*/INconstcharFAR*addr,
/*指向用网络字节顺序存储的主机网络地址的指针
*/INintlen,
/*地址长度
*/INinttype,
/*地址类型
*/OUTcharFAR*buf,
/*接收主机信息的数据缓冲区指针
*/INintbuflen,
/* buf的长度
*/);
● WSAAsyncGetProtoByName():通过协议名获得协议名字和协议号信息。 定义:
HANDLEWSAAPI WSAAsyncGetProtoByName( INHWNDhWnd,
/*
请求完成时,接收消息的窗口句柄
*/INunsignedintwMsg,
/*
请求完成时接收到的消息
*/INconstcharFAR*name,
/*
指向主机名字的指针
*/OUTcharFAR*buf,
/*
接收协议信息的数据缓冲区指针
*/INintbuflen,
/* buf的长度
*/);
● WSAAsyncGetServByName():通过服务名和协议名获得服务信息。 定义:
HANDLEWSAAPI WSAAsyncGetServByName(INHWNDhWnd,
/*
请求完成时,接收消息的窗口句柄
*/INunsignedintwMsg,
/*
请求完成时接收到的消息
*/
INconstcharFAR*name,
/*
指向服务名的指针
*/INconstcharFAR*proto,
/*
指向协议名的指针
*/OUTcharFAR*buf,
/*
接收服务数据的缓冲区指针
*/INintbuflen,
/*buf的长度
*/); ● WSACancelAsyncRequest():取消以上的异步服务类函数引起的异步操作。 定义:
intWSAAPI WSACancelAsyncRequest( INHANDLEhAsyncTaskHandle/*指示被取消的操作的任务句柄*/); 3)异步选择函数
Winsock提供的异步选择函数用来选择应用程序感兴趣的网络事件,它允许应用程序注册一个或多个感兴趣的网络事件,当这些事件发生时,应用程序相应的窗口会收到一个消息。这类函数主要有: ● WSAAsyncSelect():发生注册的感兴趣的网络事件时,向指定窗口发送消息。 定义:
intWSAAPI WSAAsyncSelect( NSOCKETs,
/*
标识请求事件通知的套接字描述符
*/ INunsignedintwMsg,
/*
事件发生时接收到的消息
*/ INlonglEvent,
/*
注册网络事件的位屏蔽
*/);
参数lEvent有以下八种,在某一时刻只能发生其中的一种情况:
FD_READ:读就绪时接收通知。
FD_WRITE:写就绪时接收通知。
FD_OOB:带外数据来到时接收通知。
FD_ACCEPT:连接时接收通知。 FD_CONNECT:连接建立时接收通知。
FD_CLOSE:socket关闭时接收通知。
FD_QOS:socket服务质量改变时接收通知。
FD_GROUP_QOS:socket服务质量改变时接收通知(为套接字组保留使用)。
4)阻塞处理函数 阻塞处理是必不可少的功能,这是Winsock提供的重要功能。之所以安排这样的函数主要是适应Windows的多线程环境,让用户可以自行建立和取消阻塞调用。这类函数主要有: ● WSAIsBlocking():检测当前是否有阻塞调用(在Winsock2.0之前的版本中使用)。定义:
BOOLWSAAPI sBlocking(void); /*如果有未完成的阻塞调用返回值TRUE*/ ● WSACancelBlockingCall():结束当前尚未完成的任何阻塞调用(在Winsock2.0之前的版本中使用)。 定义:
intWSAAPIWSACancelBlockingCall(void); /*返回值为0表示调用被取消
*/
定义:
intWSAAPIWSAUnhookBlockingHook(void); /*返回值为0表示程序被删除
*/ 5)错误处理函数
Winsock提供了两个错误处理函数,在多线程环境中获得和设置当前线程的最近错误号。这两个函数分别为: ● WSAGetLastError():获得最近的错误操作码。
定义:
intWSAAPIWSAGetLastError(void); /*返回最近的错误操作码
*/
在应用中,同样可以使用getsockopt()的SO_ERROR获得错误码,但它只能获得特定的socket的错误码,而WSAGetLastError()得到的是所有socket中最近发生的错误码。 以下是该函数调用的示例:
/*根据错误代码,输出相应的错误信息
*/ voidGetWSAError(){ intError; ● WSASetLastError():应用程序为当前线程设置错误码。 定义:
voidWSAAPI WSASetLastError( INintiError); /*指示由WSAGetLastError调用返回的错误码
*/
3.Winsock2扩展函数
Winsock2.0版本是为了适应32位网络编程而制定的,网络技术发展突飞猛进,早期的16位编程规范已经不能适应当前的应用,所以,在Winsock1.1版的基础上,Winsock2.0提供了一个与协议无关的、具有实时网络传输能力的socket。Winsock2.0在保证完全向下兼容的同时,新增加了支持不同传输协议、与协议无关的名字解析协议、重叠I/O、QoS扩展机制、与协议无关的多址广播和多点通信等许多扩展功能。
扩展函数可以分为以下两类:数据传输函数和名字注册解析函数。
1)数据传输函数 ● WSAAccept():类似于accept(),支持有条件的接收连接。 定义:
SOCKETWSAAPI WSAAccept(INSOCKETs,
/*标识请求事件通知的套接字描述符
*/OUTstructsockaddrFAR*addr,
/*指向连接实体地址缓冲区指针
*/ INLPWSABUFlpCallerData,
/*
与连接请求一起发送的数据
*/ INOUTLPQOSlpSQOS,
/*
调用者指定的socket的流规格
*/ INOUTLPQOSlpGQOS,
/*
调用者创建socket组的流规格
*/ INLPWSABUFlpCalleeId,
/*
值参,连接实体的本地地址
*/OUTLPWSABUFlpCalleeData,
/*
接收连接实体发回的用户数据
*/ OUTGROUPFAR*g,
/*
条件函数为g赋值以进行不同的操作
*/ INDWORDdwCallbackData); /*WSAAccept调用的该参数的初始值
*/ ● WSACloseEvent():关闭一个打开的事件对象句柄。 定义:
BOOLWSAAPI WSACloseEvent(INWSAEVENThEvent); /*标识一个打开的事件对象句柄
*/ ● WSAConnect():创建一个对等连接,交换连接数据,并根据所提供的流规格确定提供的服务质量,是connect()的扩展形式。 定义:
intWSAAPI WSAConnect(INSOCKETs,
/*
标识一个未连接socket的标识符
*/
INconststructsockaddrFAR*name,
/*
连接方的名字
*/INintnamelen,
/* name的长度
*/ INLPWSABUF lpCallerData,
/*
指向用户数据的指针,建立连接时传送给对等方
*/ OUTLPWSABUFlpCalleeData,
/*
和lpCallerData相反,在建立连接时从对等方送回
本地主机
*/INLPQOSlpSQOS,
/*
每个该指针指向一个流规格的方向
*/ INLPQOSlpGQOS); /*
为套接字组保留,用法同lpSQOS */ ● WSACreateEvent():创建一个事件对象。 定义:
WSAEVENTWSAAPIWSACcreate(Void); /*返回事件对象的句柄
*/ ● WSADuplicateSocket():返回指定结构的信息,为共享套接字创建新的套接字描述符。 定义:
intWSAAPI WSADuplicateSocket( INSOCKETs,
/*
标识一个本地socket的标识符
*/ INDWORDdwProcessID,
/*
上述socket的目标进程标识
*/ OUTLPWSAPROTOCOL_INFOlpProtocolInfo); /*缓冲区,用以存放WSAPROTOCOL_INFO
结构
*/
● WSAEnumNetworkEvents():检查是否有网络事件发生。 定义:
intWSAAPI WSAEnumNetworkEvents(INSOCKETs,
/*
标识 一个本地socket的标识符
*/ INWSAEVENThEventObject,
/*
标识需要复位的事件(如果有这样的事件) */ OUTLPWSANETWORKEVENTSlpNetworkEvents); /*
记录事件和错误代码的数组
*/ ● WSAEventSelect():把网络事件和一个事件对象连接。 定义:
intWSAAPI WSAEventSelect( INSOCKETs,
/*
标识一个本地socket的标识符
*/ INWSAEVENThEventObject,
/*
标识需要复位的事件(如果有这样的事件)*/ INlonglNetworkEvents); /*
标识一个lNetworkEvents指定的事件对象
*/ ● WSAGetOverlappedResult():得到重叠操作的完成结果。 定义:
BOOLWSAAPI WSAGetOverlappedResult( INSOCKETs,
/*标识一个本地socket的标识符
*/ INLPWSAOVERL APPEDlpOverlapped, /*指向重叠操作时指定WSAOVERLAPPED结构*/OUTLPDWORDlpcbTransfer,
/*指向一个存放发送字节数的变量
*/INBOOLfWait,
/*指示重叠操作是否完成
*/OUTLPDWORDlpdwFlags); /*完成状态的标志位变量
*/
● WSAGetQoSByName():对于一个传输协议服务名字提供相应的QoS参数,初始化一个QoS结构。 定义:
BOOLWSAAPI WSAGetQoSByName(INSOCKETs,
/*标识一个本地socket的标识符
*/ INOUTLPWSABUFlpQoSName,
/* IN标识QoS模板名,OUT标识可用模板列表的缓冲区
*/OUTLPQOSlpQoS); /*
指向填充QoS结构的指针
*/
● WSAHtonl():把一个以主机字节顺序表示的32位无符号长整型数转换为网络字节顺序。 定义:
intWSAAPI WSAHtonl( INSOCKETs,
/*标识一个本地socket的标识符
*/ INu_longhostlong,
/*以主机字节顺序表示的数
*/ OUTu_longFAR*lpnetlong); /*指向转换后的网络字节顺序的数的指针
*/ ● WSAHtons():把一个以主机字节顺序表示的16位无符号短整型数转换为网络字节顺序。 定义:
intWSAAPI WSAHtons( INSOCKETs,
/*标识一个本地socket的标识符
*/ INu_shorthostshort,
/*以主机字节顺序表示的数
*/OUTu_shortFAR*lpnetshort); /*指向转换后的网络字节顺序的数的指针
*/ INDWORDcbOutBuffer,
/* lpvOutBuffer的大小
*/OUTLPDWORDlpcbBytesReturned,
/*实际输出字节数地址
*/ INLPWSAOVERLAPPEDlpOverlapped,
/*WSAOVERLAPPED结构的地址
*/ INLPWSAOVERLAPPED_COMPLETION_ROUTINElpCompletionRoutine); /*指向操作结束后完成例程的指针
*/ OUTLPWSABUFlpCalleeData,
/*返回的用户数据指针
*/INLPQOSlpSQOS,
/*每个该指针指向一个流规格的方向
*/INLPQOSlpGQOS); /*为套接字组保留,用法同lpSQOS */INDWORDdwFlags,
/*标识socket是发送者或接收者
*/ ● WSANtohl():ntohl()函数的扩展版本,与WSAHtonl操作相反,将一个以网络字节顺序标识的无符号长整型数转换为32位主机字节顺序。
定义:
intWSAAPI WSANtohl( INSOCKETs,
/*标识一个本地socket的标识符
*/INu_longnetlong,
/*以网络字节顺序表示的数
*/OUTu_longFAR*lphostlong); /*指向转换后的主机字节顺序的数的指针
*/ ● WSANtohs():ntohs()函数的扩展版本,与WSAHtons操作相反,将一个以网络字节顺序标识的无符号短整型数转换为16位主机字节顺序。
定义:
intWSAAPI WSARecv(INSOCKETs,
/*标识一个已经连接的socket的标识符
*/INOUTLPWSABUFlpBuffer,
/*指向
WSABUF结构数组的指针
*/INDWORDdwBufferCount,
/*缓冲区中WSABUF结构的数目
*/
OUTLPDWORDlpNumberOfBytesRecvd,
/*指向本操作接收字节数的指针
*/ INOUTLPDWORDlpFlags,
/*指向标志位的指针
*/INLPWSAOVERLAPPEDlpOverlapped,
/*WSAOVERLAPPED结构的地址
*/INLPWSAOVERLAPPED_COMPLETION_ROUTINElpCompletionRoutine); /*指向操作结束后完成例程的指针
*/ OUTLPDWORDlpNumberOfBytesRecvd,
/*指向本操作接收字节数的指针
*/INOUTLPDWORDlpFlags,
/*指向标志位的指针
*/INLPWSAOVERLAPPEDlpOverlapped,
/*WSAOVERLAPPED结构的地址
*/INLPWSAOVERLAPPED_COMPLETION_ROUTINElpCompletionRoutine);/*指向操作结束后完成例程的指针
*/ ● WSARecvDisconnect():终止套接字的接收操作。如果套接字是基于连接的,则读取终止连接数据。 定义:
intWSAAPI WSARecvDisconnect(INSOCKETs,
/*标识一个socket的标识符
*/OUTLPWSABUFlpInboundDisconnectData); /*指向终止连接数据的指针
*/
● WSARecvFrom():recvfrom()函数的扩展版本,它支持分散/聚集I/O和重叠socket操作,接收一个数据报并保存源地址。 定义:
intWSAAPI WSARecvFrom( INSOCKETs,
/*标识一个socket的标识符
*/ INOUTLPWSABUFlpBuffer,
/*指向
WSABUF结构数组的指针
*/INDWORDdwBufferCount,
/*缓冲区中WSABUF结构的数目
*/OUTLPDWORDlpNumberOfBytesRecvd,
/*指向本操作接收字节数的指针
*/ ● WSAResetEvent():重新初始化一个事件对象。 定义:
BOOLWSAAPI WSAResetEvent(INWSAEVENThEvent); /*标识一个开放的事件对象句柄
*/ ● WSASend():send()函数的扩展版本,它支持分散/聚集I/O和重叠套接字操作,在一个已经连接的socket上发送数据。
定义:
intWSAAPI WSASend( INSOCKETs,
/*标识一个已连接的socket的标识符
*/INLPWSABUFlpBuffer,
/*指向
WSABUF结构数组的指针
*/ INDWORDdwBufferCount,
/*缓冲区中WSABUF结构的数目
*/ OUTLPDWORDlpNumberOfBytesSent, /*指向本操作发送字节数的指针
*/ INDWORDdwFlags,
/*操作标志位
*/ INLPWSAOVERLAPPEDlpOverlapped,
/*WSAOVERLAPPED结构的地址
*/ INLPWSAOVERLAPPED_COMPLETION_ROUTINElpCompletionRoutine); /*指向操作结束后完成例程的指针
*/ ● WSASendTo():sendto()函数的扩展版本,它支持分散/聚集I/O和重叠套接字操作,可以向指定地址发送数据。 定义:
intWSAAPI WSASendTo(INSOCKETs,
/*标识一个socket的标识符
*/ INLPWSABUFlpBuffer,
/*指向
WSABUF结构数组的指针
*/ INDWORDdwBufferCount,
/*缓冲区中WSABUF结构的数目
*/ OUTLPDWORDlpNumberOfBytesSent,
/*指向本操作发送字节数的指针
*/ INDWORDdwFlags,
/*操作标志位
*/INconststructsockaddrFAR*lpTo,
/*指向目的socket地址的指针
*/INintiTolen,
/* lpTo的长度
*/
定义:
SOCKETWSAAPI WSASocket( INintaf,
/*地址描述参数
*/INinttype,
/*创建的socket类型描述
*/INintprotocol,
/*使用的协议
*/INLPWSAPROTOCOL_INFOlpProtocolInfo,
/*指向结构定义的指针
*/INGROUPg,
/*保留为socket组使用
*/INDWORDdwFlags); /* socket属性描述
*/ 2)名字注册解析函数 ● WSAAddressToString():显示SOCKADDR中的信息。 定义:
INTWSAAPI WSAAddressToString( INLPSOCKADDRlpsaAddress,
/*要转换的SOCKADDR结构的信息
*/INDWORDdwAddressLength,
/*SOCKADDR的地址长度
*/ INLPWSAPROTOCOL_INFOlpProtocolInfo,
/*指向结构定义的指针
*/ OUTLPTSTRlpszAddressString,
/*存放转换后的地址字符串的缓冲区
*/ INOUTLPDWORDlpdwAddressStringlength); /*作输入是指地址缓冲区长度,作输出是
指缓冲区字符串的实际长度
*/ ● WSAEnumNameSpaceProviders():检索可用的名字空间。 定义:
INTWSAAPI WSAEnumNameSpaceProviders( INOUTLPDWORDlpdwBufferLength,
/*作输入是指缓冲区字节数,作输出是指检索所有
请求信息需要传递的缓冲区的最小字节数
*/ OUTLPWSANAMES PACE_INFOlpnspBuffer); /*指示该函数返回值缓冲区的指针
*/ ● WSAGetServiceClassInfo():检索服务所属类的信息。 定义:
INTWSAAPI WSAGetServiceClassInfo( INLPGUIDlpProviderId,
/*指向名字空间提供着的指针
*/ INLPGUIDlpServiceClassId,
/*指向要查询的服务类的指针
*/
INOUTLPGUIDlpdwBufferLength,
/*作输入是指缓冲区字节数,作输出是指检索所有请求信息需要传递的缓冲区的最小字节数
*/ OUTLPWSASERVICECLASSINFOlpServiceClassInfo); /*存放服务类信息的缓冲区
*/ ● WSAInstallServiceClass():注册服务类的特定信息。 定义:
INTWSAAPI WSAInstallServiceClass(INLPWSASERVICECLASSINFOlpServiceClassInfo); /*存放服务类信息的缓冲区
*/ ● WSALookupServiceBegin():用户指定查询的初始化,返回一个句柄,和函数WSALookupServiceNext()配合使用。 定义:
INTWSAAPI WSALookupServiceBegin( INLPWSAQUERYSETlpqsRestrictions, /*WSAQUERYSET结构指定查询标准
*/INDWORDdwControlFlags,
/*控制查询深度标志
*/OUTLPHANDLElphLookup); /* WSALookupServiceNext()调用的句柄
*/ INDWORDdwControlFlags,
/*指示下一次操作的标识
*/ INOUTLPGUIDlpdwBufferLength,
/*作输入是指lpqsResults的字节数,作输出是指lpqsResults指示的最小字节数
*/OUTLPWSAQUERYSETlpqsResults); /*返回结果所在的内存地址指针
*/ ● WSARemoveServiceClass():注销服务类概要。 定义:
INTWSAAPIWSARemoveServiceClass(INLPGUIDlpServiceClassId);/*指示要注销服务类指针
*/ ● WSAStringToAddress():将可读字符串转换为socket地址结构。 定义:
INTWSAAPI WSAStringToAddress( INLPTSTRAddressString,
/*指示需要转换的字符串
*/ ININTAddressFamily,
/*字符串所属地址簇
*/ INLPWSAPROTOCOL_INFOlpProtocolInfo,/*指向与要使用的提供者相关的
WSAPROTOCOL_INFO */
● FD_ISSET:如果fd是socket集合的元素,则返回真值,否则为0。 定义:
BOOLFD_ISSET(SOCKETfd,
fd_setFAR*set) /* set是指向socket集合结构的指针
*/ ● FD_SET:添加socket描述符fd到集合set中。 定义:
voidFD_SET(SOCKETfd,
fd_setFAR*set) /* set是指向socket集合结构的指针
*/ ● FD_ZERO:初始化socket集合。 定义:voidFD_ZERO(fd_setFAR*set) /* fd_setFAR*是指向socket结构的指针
*/
注意:以上以FD开头定义的宏都是针对socket集合fd_set制定的,应用程序开发者最好使用这些宏对集合进行操作,可以避免很多错误。 ● WSAGETASYNCBFLEN:从异步服务函数的操作完成
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 防爆电气线路安全技术培训
- 2026中国消费电子产业链调研及市场趋势与投资机会分析报告
- 2026中国智能机器人巡检行业市场需求供给及商业投资规划发展分析研究报告
- 2026燃料电池技术研究行业竞争格局及投资规划展望
- 2026人工智能无人驾驶技术发展现状分析与发展潜力评估报告
- 2026中国叶黄素酯行业价格传导机制与成本管控最佳实践报告
- 2026圣巴托洛缪岛信息技术产业发展机遇分析与发展政策鼓励
- 2026中国印刷和包装材料行业市场现状供需分析及投资评估规划分析研究报告
- 炼钢过程中的主要危险因素培训课件
- 2026汽车装饰用品喷涂炭纤维性能拉伸确认框架工艺成本降低估值手段手册
- (2026版)中华人民共和国生态环境法典培训课件
- 中国融通资源开发集团有限公司面向退役军人专项招聘100人笔试备考题库及答案详解
- 2026中国兽药行业市场现状分析及投资前景与发展规划报告
- 新疆医科大学第八附属医院2026年面向社会公开招聘事业单位编制外工作人员(29人)考试备考试题及答案详解
- 2026年混凝土结构工程施工质量验收规范试题附答案
- 2026学年四川省攀枝花市二年级数学期末模考重点试题(附答案)详细答案和解析
- 堤防波浪壅高、爬高计算表格
- 教育统计与测量评价新编教程全套教学课件
- 稻茬小麦高产超高产栽培综合技术演示文稿
- DB44T 195.3-2004生物防火林带建设 技术规程
- 青岛北客站综合施工组织设计实施
评论
0/150
提交评论