要想获得系统中安装的网络协议的相关信息,调用这个函数W S A E n u m P r o t o c o l s即可,并像这样定义它:
int WSAEnumprotocols{
LPINT lpiprotocols,
LPWSAPROCOL_INFO lpprotocolbuffer,
LPDWORD lpdwbufferlength
};
返回的W S A P R O TO C O L _ I N F O结构的格式如下:
typedef struct _WSAPROTOCOL_INFO{
DWORD dwServiceFlags1;
DWORD dwServiceFlags2;
DWORD dwServiceFlags3;
DWORD dwServiceFlags4;
DWORD dwProviderFlags; //建立SOCKET时如果第三个参数为0时使用的默认传输协议
GUID ProviderId;
DWORD dwCatalogEntryId;
WSAPROTOCOLCHAIN ProtocolChain;
int iVersion;
int iAddressFamily; //为指定协议区分正确的定址结构
int iMaxSockAddr;
int iMinsockAddr;
int iSocketType; //区分协议的多重行为
int iProtocol; //定义该条目属于哪个协议
int iProtocolMaxOffset;
int iNetworkByteOrder;
int iSecurityScheme;
DWORD dwMessageSize;
DWORD dwProviderReserved;
WCHAR szProtocol[WSAPROTOCOL_LEN+1];
}WSAPROTOCOL_INFOW,FAR *LPWSAPROTOCOL_INFOW;
在可以调用一个Wi n s o c k函数之前,必须先加载一个版本正确的Wi n s o c k库。
int WSAStartup(WORD wVe r s i o n R e q u e s t e d , L P W S A D ATA lpWSAData)
第一个参数是准备加载的Wi n s o c k库的版本号。就目前的Wi n 3 2平台而言,Winsock 2库的最新版本是2 . 2。如果需要
Winsock 2.2版,指定这个值( 0 x 0 2 0 2)或使用宏M A K E W O R D ( 2 , 2 )即可。高位字节指定副版本,而低位字节则指定主版本。
第二个参数是W S A D ATA结构,它是调用完成之后立即返回的。
typedef struct WSAData{
WORD wVersion;
WORD wHighVersion;
char szDescription[WSADESCRIPTION_LEN+1];
char szSystemStatus[WSASYS_STATUS_LEN+1];
unsigned short iMaxSocket;
unsigned short iMaxUdpDg;
char FAR* lpVendorInfo;
}WSADATA,FAR* LPWSADATA;
w Ve r s i o n 调用者希望使用的Wi n s o c k版本号
w H i g h Ve r s i o n 加载的Wi n s o c k库所支持的最高Wi n s o c k版本,通常和w Ve r s i o n的值相同
s z D e s c r i p t i o n 加载的Wi n s o c k库的文本说明
s z S y s t e m S t a t u s 一个文字串,其中包含相应的状态或配置信息
i M a x S o c k e t s 套接字的最大编号( Winsock 2或稍后的版本忽略了该字段)
i M a x U d p D g U D P数据报的最大容量( Winsock 2或稍后的版本忽略了该字段)
l p Ve n d o r I n f o 厂商专有信息(Winsock 2 或稍后的版本忽略了该字段)
当不在需要这个库时的卸载函数为int WSACleanup (void);
要调用W S A E n u m P r o t o c o l s函数,最简单的方法是利用相当于N U L L和l p d w B u ff e r L e n g t h的l p P r o t o c o l B u ff e r ,令初次调用为0 。调用失败,返回W S A E N O B U F S 错误,但l p d w B u ff e r L e n g t h中包含了恰如其分的缓冲区长度(这一长度是返回所有协议信息所需的)。
W S A P R O TO C O L _ I N F O结构最常用的字段是d w S e r v i c e F l a g s 1,它是代表不同协议属性的一个位字段
X P l _ C O N N E C T I O N L E S S 该协议提供无连接的服务。如果不设,则支持面向连接的数据传
输
X P l _ G U A R A N T E E D _ D E L I V E RY 该协议保证发送出去的所有数据都将到达既定接收端
X P l _ G U A R A N T E E D _ O R D E R 保证数据按其发送顺序到达接收端,且数据不会重复。但是,该
协议不能保证投递的准确性
X P l _ M E S S A G E _ O R I E N T E D 实现消息边界
X P l _ P S E U D O _ S T R E A M 该协议是面向消息的,但接收端会忽略消息边界
X P l _ G R A C E F U L _ C L O S E 支持二相关闭:通知各个通信方另一方打算关闭通信信道。如果
不设,则只执行失败关闭
X P l _ E X P E D I T E D _ D ATA 该协议提供紧急数据(带外数据)
X P l _ C O N N E C T _ D ATA 该协议支持带有连接请求的数据传输
X P l _ D I S C O N N E C T _ D ATA 该协议支持带有无连接请求的数据传输
X P l _ S U P P O RT _ B R O A D C A S T 该协议支持广播机制
X P l _ S U P P O RT _ M U LT I P O I N T 该协议支持多点或多播机制
X P l _ M U LT I P O I N T _ C O N T R O L _ P L A N E 如果设置了这个协议标志,就会启动控制面板。反之,则不启动
X P l _ M U LT I P O I N T _ D ATA _ P L A N E 如果设置了这个协议标志,就会启动数据面板。反之,则不启动
X P l _ Q O S _ S U P P O RT E D 该协议标志支持Q o S请求
X P l _ U N I _ S E N D 该协议在发送方向上是单向的
X P l _ U N I _ R E C V 该协议在接收方向上是单向的
X P l _ I F S _ H A N D L E S 提供者返回的套接字描述符是Installable File System(可安装文件系统)句柄,可用于ReadFile Wr i t e F i l e之类的A P I函数中
X P l _ PA RT I A L _ M E S S A G E W S A S e n d和W S A S e n d To中均支持M S G _ PA RT I A L标志
套接字有两种函数可以建立:
SOCKET WSASocket(
int af;
int type;
int protocol;
LPWSAPROTOCOL_INFO lpProtocolInfo;
GROUP g;
DWORD dwFlags;
);
SOCKET socket(
int af;
int type;
int protocol
);
第一个参数a f,是协议的地址家族。。比如,如果想建立一个U D P或T C P套接字,可用常量A F _ I N E T来指代互联网协议( I P)
第二个参数t y p e,是协议的套接字类型。套接字的类型可以是下面五个值: S O C K _ S T R E A M、S O C K _ D G R A M、S O C K _ S E Q PA C K E T、S O C K _ R AW和S O C K _ R D M。
第三个参数是p r o t o c o l。指定的地址家族和套接字类型有多个条目时,就可用这个字段来限定使用特定传输。
如果在W S A S o c k e t函数时,已经利用W S A E n u m P r o t o c o l s列举了所有协议,就可选定一个W S A P R O TO C O L _ I N F O结构,并将它当作l p P r o t o c o l I n f o参数投递到W S A S o c k e t。之后,若在前三个参数(a f、t y p e和p r o t o c o l)中都指定常量F R O M _ P R O TO C O L _ I N F O,就会转而采用W S A P R O TO C O L _ I N F O结构中提供那三个值;
组参数始终为0;
要指定一个或多个下列标志,可用d w F l a g s参数:
■ W S A _ F L A G _ O V E R L A P P E D
■ W S A _ F L A G _ M U LT I P O I N T _ C _ R O O T
■ W S A _ F L A G _ M U LT I P O I N T _ C _ L E A F
■ W S A _ F L A G _ M U LT I P O I N T _ D _ R O O F
■ W S A _ F L A G _ M U LT I P O I N T _ D _ L E A F
第一个参数制定SOCKET具备重叠I/O使用socket函数创建SOCKET时默认有;
具体平台的问题
Windows NT 4和Windows 2000都支持Wi n s o c k 2,Windows CE只支持Winsock 1.1规格。
Windows CE只支持T C P / I P和红外线套接字.