c++中Socket通信函数之WSAStartup
socket通信的整个过程:

WSAStartup
此函数在应用程序中初始化winsockDLL
int WSAStartup(
__in WORD wVersionRequested,
__out LPWSADATA lpWSAData
);
wVersionRequested
调用程序使用windows socket的最高版本。 高字节指定小的版本号,低字节指定高的版本号。
lpWSAData
指向WSADATA数据结构体指针,接收Windows Socket的实现细节。
返回值
如果成功,WSAStartup函数返回0。否则,返回下面列表显示的错误码之一。
WSAStartup函数直接在返回值中返回扩展的错误码,不再需要调用WSAGetLastError函数。
错误码
解释
WSASYSNOTREADY
网络通信中下层的网络子系统没准备好
WSAVERNOTSUPPORTED
Socket实现提供版本和socket需要的版本不符
WSAEINPROGRESS
一个阻塞的Socket操作正在进行
WSAEPROCLIM
Socket的实现超过Socket支持的任务数限制
WSAEFAULT
lpWSAData参数不是一个合法的指针
说明
使用Socket之前必须调用WSAStartup函数,此函数在应用程序中用来初始化Windows Sockets DLL,只有此函数调用成功后,应用程序才可以调用Windows SocketsDLL中的其他API函数,否则后面的任何函数都将调用失败。
为了支持日后各种不同功能winsock实现和应用,在WSAStartup函数中做了协商。WSAStartup函数的调用方和Windows Sockets DLL互相通知对方它们可以支持的最高版本。并且互相确认对方的最高版本是可接受的。
在WSAStartup函数的入口,Windows Sockets DLL检查了应用程序所需的版本.如果版本高于DLL支持的最低版本,则调用成功并且DLL在wHighVersion中返回它所支持的最高版本,在wVersion中返回它的高版本和wVersionRequested中的较小者,然后Windows Sockets DLL就会假设应用程序将使用wVersion。如果WSDATA结构中的wVersion域对调用方来说不可接收, 它就应调用WSACleanup函数并且要么去另一个Windows Sockets DLL中搜索,要么初始化失败。
一旦一个应用或者DLL成功调用WSAStartup函数,应用程序才可以处理其他的winsock 中的其他函数。当应用或者DLL调用Winsock DLL服务完成,必须调用WSACleanup函数,此函数让Winsock DLL释放应用用到的Winsock资源。
应用可以调用WSAStartup不止一次,如果它需要获得WSADATA结构体信息不止一次。在每次调用时,应用可以指定任何winsock DLL支持的版本数。
WSAStartup函数通常导致具体协议帮助DLL一直加载,因此,WSAStartup函数不能被一个DLL应用的DLLMain函数调用。这样可能导致死锁的发生。
应用必须调用WSAClearup函数在每次成功调用WSAStartup函数。这就意味着,例如应用调用WSAStartup函数三次,它也需要调用WSAClearup函数三次。前两次调用WSAClearup函数除了减少内部计数器什么都不做,最后一个次调用WSAClearup函数则释放任务使用的需要的资源。
例子
#defineWIN32_LEAN_AND_MEAN #include<windows.h> #include<winsock2.h> #include<ws2tcpip.h> #include<stdio.h> //链接 Ws2_32.lib #pragmacomment(lib, "ws2_32.lib") int __cdeclmain() { WORD wVersionRequested; WSADATA wsaData; int err; /* 使用Windef.h中的 MAKEWORD(lowbyte, highbyte) 宏定义 */ wVersionRequested = MAKEWORD(2, 2); err = WSAStartup(wVersionRequested,&wsaData); if (err != 0) { /* 找不到Winsock DL L.*/ printf("WSAStartup failed witherror: %d\n", err); return 1; } /*确保 WinSock DLL 支持 2.2.*/ /* Note that ifthe DLL supports versions greater */ /* than 2.2 inaddition to 2.2, it will still return */ /* 2.2 inwVersion since that is the version we */ /*requested. */ if (LOBYTE(wsaData.wVersion) != 2 ||HIBYTE(wsaData.wVersion) != 2) { /* Tell the user that we could not finda usable */ /* WinSock DLL. */ printf("Could not find a usableversion of Winsock.dll\n"); WSACleanup(); return 1; } else printf("The Winsock 2.2 dll wasfound okay\n"); /* The WinsockDLL is acceptable. Proceed to use it. */ /* Add networkprogramming using Winsock here */ /* then callWSACleanup when done using the Winsock dll */ WSACleanup(); }相关热词:
本站内容来源于网络,如有侵权请与我们联系,我们会及时删除,我们深感抱歉!
注:本站所有信息仅供用于网络技术学习参考,学习中请遵循相关法律法规!
本文地址: https://www.juheyunku.com/jiaob/net/10639.shtml
相关文章
热门TAG
命令 权重 外链 企业网站 白帽 php 织梦教程 dedecms修改内容 javascript 织梦 功能 标签 调用 详解 服务器 网站流量 实例解析 Dedecms 织梦cms HTML tags标签 python jquery教程 jquery windows SEO优化 蜘蛛 搜索引擎 网站收录 JSP最新文章
-
如何给asp.net core写个中间
时间:2021-01-03
-
.Net微信网页开发解决用户
时间:2021-01-03
-
c++中Socket通信函数之WSAS
时间:2020-12-29
-
提高生产性工具
时间:2020-12-29
-
全新的membership框架Asp.ne
时间:2020-12-29
-
不用找了,比较全的signal
时间:2020-12-29
-
计算字符串中每种字符出
时间:2020-12-29
-
EntityFramework 5.0 CodeFirst 教
时间:2020-12-29
热门文章
-
.NET 开发环境搭建图文详解
时间:2020-12-27
-
Windows下Visual Studio 2017安装配置方法图文教
时间:2020-12-23
-
.Net微信网页开发解决用户在不同公众号或
时间:2021-01-03
-
oracle 11g rac安装之grid报错解决
时间:2020-12-28
-
ASP.NET Core 3.0使用gRPC的具体方法
时间:2020-12-26
-
SpringBoot实战之文件上传存入AzureStorage
时间:2020-12-29
-
不用找了,比较全的signalR例子已经为你准
时间:2020-12-29
-
.NET Core3.1编写混合C++程序
时间:2020-12-26
-
Oracle的卸载
时间:2020-12-28
-
计算字符串中每种字符出现的次数[Dicti
时间:2020-12-29
