在编写Windows网络应用程序的时候,最常用的便是Winsock接口,注意它不是网络协议,你可以理解它为网络应用API。在百度百科中是这样介绍的:
” Windows下网络编程的规范-Windows Sockets是Windows下得到广泛应用的、开放的、支持多种协议的网络编程接口。从1991年的1.0版到1995年的2.0.8版,经过不断完善并在Intel、Microsoft、Sun、SGI、Informix、Novell等公司的全力支持下,已成为Windows网络编程的事实上的标准。 “
实际上Windows95以后的各个windows版本都支持Winsock2.2版本,但是Window CE 只支持1.1版本。Winsock2.2提供了更多的功能和API函数,而且区分两个版本的函数非常容易,2.2版本的API函数都以WSA开头的,除了WSAStartup, WSACleanup, WSARecvEx, 和 WSAGetLastError这几个函数也出现在1.1版本中。
使用Winsock写应用程序所需要的头文件和类库有:
- // 对于1.1版本
- #include<winsock.h>
- #pragma comment(lib, "wsock32.lib")
- // 对于2.2版本
- #include<winsock2.h>
- #pragma comment(lib, "ws2_32.lib")
现在我们来看看一个通用的Winsock应用程序框架:
- #include<winsock2.h> // 头文件
- #pragma comment(lib, "ws2_32.lib") // 库文件加载
- void main(void)
- {
- WSADATA wsaData; // WSADATA 结构体主要包含了系统所支持的Winsock版本信息
- // 初始化Winsock 2.2。使用WSAStartup函数,第一个参数是所要用的Winsock版本号
- // 第二个参数就是WSADATA结构体的指针。如果初始化成功则返回0
- // 要注意任何WinsockAPI函数都必须在初始化后使用,包括错误检查函数
- // WSAGetLastError (用于查看出错详细信息)
- if( WSAStartup( MAKEWORD(2,2), &wsaData) != 0 )
- {
- printf( "WSAStartup 无法初始化!");
- return;
- }
- // winsock 应用代码
- // 最后应该做一些清除工作
- if( WSACleanup() == SOCKET_ERROR )
- printf( "WSACleanup 出错!");
- }
1.
WSADATA结构体:
- typedef struct WSAData
- {
- WORD wVersion;
- WORD wHighVersion;
- char szDescription[WSADESCRIPTION_LEN + 1];
- char szSystemStatus[WSASYS_STATUS_LEN + 1];
- unsigned short iMaxSockets;
- unsigned short iMaxUdpDg;
- char FAR * lpVendorInfo;
- } WSADATA, * LPWSADATA;
wHiVersion 是系统所支持的最高版本,如果初始化失败,这个参数仍然返回。
其他成员基本都用不到,所以不必关心。
2.对应每一个WSAStartup都要有一个WSACleanup与之对应