Winsock学习 ----- Winsock初始化

每个Winsock应用程序都必须加载 Winsock DLL 的相应版本。如果调用Winsock之前没有加载Winsock库,函数会返回 SOCKET_ERROR, 错误信息是 WSANOTINITIALISED。加载Winsock库是通过调用WSAStarup函数实现的。

函数定义:

int WSAStarup(

WORD wVersionRequest,

LPWSADATA lpWSAData

wVersionRequest 参数用于制定准备加载的Winsock库的版本。 高位字节指定所需要的Winsock库的副版本,而低位字节则是主版本。然后,可以用宏MAKEWORD(X, Y)x 是高位字节, y是低位字节,来设定wVersionRequest的值。lpWSAData 参数是指向WSADATA结构的指针, 这个结构体保存了加载的Winsock版本的信息。

结构体信息

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

}

wVersion
Windows Sockets DLL期望调用者使用的Windows Sockets规范的版本。 高位字节存储副版本号, 低位字节存储主版本号,可以用WORD MAKEWORD(BYTE,BYTE ) 返回这个值,例如:MAKEWORD(1,1)
wHighVersion
这个DLL能够支持的Windows Sockets规范的最高版本。通常它与wVersion相同。
szDescription
以null结尾的ASCII字符串,Windows Sockets DLL将对Windows Sockets实现的描述拷贝到这个字符串中,包括制造商标识。文本(最多可以有256个字符)可以包含任何字符,但是要注意不能包含控制字符格式字符,应用程序对其最可能的使用方式是把它(可能被截断)显示在在状态信息中。
szSystemStatus
以null结尾的ASCII字符串,Windows Sockets DLL把有关的状态或配置信息拷贝到该字符串中。Windows Sockets DLL应当仅在这些信息对用户或支持人员有用时才使用它们,它不应被作为szDescription域的扩展。
iMaxSockets
单个进程能够打开的socket的最大数目。Windows Sockets的实现能提供一个全局的socket池,可以为任何进程分配;或者它也可以为socket分配属于进程的资源。这个数字能够很好地反映Windows Sockets DLL或网络软件的配置方式。应用程序的编写者可以通过这个数字来粗略地指明Windows Sockets的实现方式对应用程序是否有用。例如,X Windows服务器在第一次启动的时候可能会检查iMaxSockets的值:如果这个值小于8,应用程序将显示一条错误信息,指示用户重新配置网络软件(这是一种可能要使用szSystemStatus文本的场合)。显然无法保证某个应用程序能够真正分配iMaxSockets个socket,因为可能有其它WindowsSockets应用程序正在使用。
iMaxUdpDg
Windows Sockets应用程序能够发送或接收的最大的用户数据包协议(UDP)的数据包大小,以字节为单位。如果实现方式没有限制,那么iMaxUdpDg为零。在Berkeley sockets的许多实现中,对于UDP数据包有个固有的限制(在必要时被分解),大小为8192字节。Windows Sockets的实现可以对碎片重组缓冲区的分配作出限制。对于适合的WindowsSockets 实现,iMaxUdpDg的最小值为512。注意不管iMaxUdpDg的值是什么,都不推荐你发回一个比网络的最大传送单元(MTU)还大的广播数据包。(Windows Sockets API 没有提供发现MTU的机制,但是它不会小于512个字节)。WinSock2.0版中已被废弃。
lpVendorInfo
指向销售商的数据结构的指针。这个结构的定义(如果有)超出了WindowsSockets规范的范围。WinSock2.0版中已被废弃。
对于采用了 Winsock 1 的应用而言, 必须有Winsock.h 包容文件, 而对使用Winsock2的应用而言,则需要包含Winsock2.h

  1. #include<iostream>
  2. #include<WinSock2.h> // 头文件
  3. using namespace std;
  4. #pragma comment(lib, "WS2_32.lib") //加载动态库
  5. int main()
  6. {
  7. WSADATA wsaData;
  8. int ret;


  9. if ((ret = WSAStartup(MAKEWORD(2, 2), &wsaData)) != 0)
  10. {
  11. printf("WSAStarup faild with error %d\n", ret);
  12. return -1;
  13. }
  14. printf("WSAStarup Success\n");
  15. if (WSACleanup() == SOCKET_ERROR)
  16. {
  17. printf("WSACleanup failed with error %d\n", WSAGetLastError());
  18. }
  19. printf("WSACleanup Success\n");
  20. system("pause");
  21. return 0;
  22. }



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值