网络套接字编程结构图
Winsock编程原理
Winsock分1.1版和2.x版,从Windows98开始都使用2.x版。Winsock 2网络应用程序运行时通过使用系统目录中的动态链接库ws2_32.dll访问TCP/IP协议栈,用VC++6.0开发时,Winsock 2中所用的函数声明、常数等等均是在头文件winsock2.h内定义的,若想使用Winsock 2,须连接的库是ws2_32.lib。应用程序中使用流套接字和数据报套接字的方法如下框图所示:
Winsock的启动和中止
由于Winsock 2提供的API服务是以动态链接库ws2_32.dll实现的,所以必须先调用
WSAStartup函数对ws2_32.dll进行加载初始化,协商Winsock的版本支持,并分配必要的资源。如果在调用Winsock函数前没有加载Winsock库,则会返回SOCKET_ERROR错误,错误信息是WSANOTINITIALISED.
在应用程序关闭套接字后,还应调用WSACleanup函数终止卸载ws2_32.dll,释放资源.
可用以下函数来实现Winsock的启动,若Winsock启动成功则返回true,否则返回false.
bool InitSocket()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 2, 0 ); //询问Winsock 2.0版本
err = WSAStartup( wVersionRequested, &wsaData ); //加载初始化Windows Sockets DLL
if ( err != 0 ) {
printf("没有Windows Socket动态库!\n");
getch();
return false;
}
if ( LOBYTE( wsaData.wVersion ) != 2 || HIBYTE( wsaData.wVersion ) != 0 ) {
printf("需要Windows Socket 2!\n");
getch();
WSACleanup( );
return false;
}
return true;
}
注意在这里函数类型是bool型的,所以主文件名一定要是cpp而不是c,不然编译时不能通过的。