ASP.NET

推荐列表 站点导航

当前位置:首页 > 脚本编程 > ASP.NET >

c++中Socket通信函数之WSAStartup

来源:网络整理  作者:网友投稿  发布时间:2020-12-29 10:32
c++中Socket通信函数之WSAStartup...

socket通信的整个过程:

c++中Socket通信函数之WSAStartup


 

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

相关文章
最新文章
如何给asp.net core写个中间 如何给asp.net core写个中间

时间:2021-01-03

.Net微信网页开发解决用户 .Net微信网页开发解决用户

时间:2021-01-03

c++中Socket通信函数之WSAS c++中Socket通信函数之WSAS

时间:2020-12-29

提高生产性工具 提高生产性工具

时间:2020-12-29

全新的membership框架Asp.ne 全新的membership框架Asp.ne

时间:2020-12-29

不用找了,比较全的signal 不用找了,比较全的signal

时间:2020-12-29

计算字符串中每种字符出 计算字符串中每种字符出

时间:2020-12-29

EntityFramework 5.0 CodeFirst 教 EntityFramework 5.0 CodeFirst 教

时间:2020-12-29

Copyright © www.juheyunku.com      关于 | 合作 | 声明 | 联系 | 更新 | 地图 | Tags

c++中Socket通信函数之WSAStartup

2020-12-29 编辑:网友投稿

socket通信的整个过程:

c++中Socket通信函数之WSAStartup


 

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

相关文章

风云图片

推荐阅读

返回ASP.NET频道首页