天天看点

《Windows网络与通信程序设计(第3版)》——第2章 Winsock编程接口2.1 Winsock库

本节书摘来自异步社区《windows网络与通信程序设计(第3版)》一书中的第2章,第2.1节,作者: 陈香凝 , 王烨阳 , 陈婷婷 , 张铮 更多章节内容可以访问云栖社区“异步社区”公众号查看。

winsock是windows下网络编程的标准接口,它允许两个或多个应用程序在相同机器上,或者是通过网络相互交流。winsock是真正的协议无关的接口,本章主要讲述如何使用它来编写应用层的网络应用程序。

winsock库有两个版本,winsock1和winsock2。现在开发网络应用程序都使用winsock2,需要在程序中包含头文件winsock2.h,它包含了绝大部分socket函数和相关结构类型的声明和定义。同时要添加的还有到ws2_32.lib库的链接。包含必要的头文件,设置好链接环境之后,便可进行下面的编码工作了。

2.1.1 winsock库的装入和释放

每个winsock应用程序必须加载相应版本的winsock dll。如果在调用winsock函数前没有加载winsock库,函数返回socket_error,出错代码将是wsanotinitialised。加载winsock库的函数是wsastartup,其定义如下。

wversionrequested参数用来指定想要加载的winsock库的版本。为了建立此参数的值,可以使用宏makeword(x, y),其中x是高字节,y是低字节。

lpwsadata是一个指向lpwsadata结构的指针,wsastartup使用所加载库的版本信息填充它。

函数调用成功返回0。否则要调用wsagetlasterror函数查看出错的原因。此函数的作用相当于api函数getlasterror,它取得最后发生错误的代码。

每一个对wsastartup的调用必须对应一个对wsacleanup的调用,这个函数释放winsock库。

所有的winsock函数都是从ws2_32.dll导出的,vc++在默认情况下并没有链接到该库,如果想使用winsock api,就必须包含相应的库文件。

2.1.2 封装cinitsock类

每次写网络程序都必须编写代码载入和释放winsock库,为了今后讨论方便,这里封装一个cinitsock类来管理winsock库,类的使用方法见下一小节。

继续阅读