官方文档:https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-wsastartup
1. 函数原型和使用
int WSAAPI WSAStartup( WORD wVersionRequested, LPWSADATA lpWSAData );
使用:
#include <winsock2.h> #include <stdio.h> #pragma comment(lib, "ws2_32.lib") int main(void) {
WORD wVersionRequested; WSADATA wsaData; int err; /* Use the MAKEWORD(lowbyte, highbyte) macro declared in Windef.h */ wVersionRequested = MAKEWORD(2, 2); err = WSAStartup(wVersionRequested, &wsaData); if (err != 0) {
/* Tell the user that we could not find a usable */ /* Winsock DLL. */ printf("WSAStartup failed with error: %d\n", err); return 1; } return 0; }
2. 功能
打开网络库/启动网络库,启动了这个库,这个库里的函数/功能才能使用。
WSAStartup
- W:windows
- S:socket
- A:Asynchronous 异步
- 同步:阻塞、卡死状态
- 异步:多个工作同时进行
- Startup:启动
3. 参数1:WORD wVersionRequested
调用者可以使用的Windows套接字规范的最高版本。 高位字节指定次要版本号; 低位字节指定主要版本号。

4. 参数2:LPWSADATA lpWSAData
指向WSADATA数据结构的指针,该数据结构将接收Windows套接字实现的详细信息。

typedef struct WSAData {
WORD wVersion;//我们要使用的版本 WORD wHighVersion;//系统能提供给我们的版本 #ifdef _WIN64 unsigned short iMaxSockets; unsigned short iMaxUdpDg; char FAR * lpVendorInfo; char szDescription[WSADESCRIPTION_LEN+1]; char szSystemStatus[WSASYS_STATUS_LEN+1]; #else char szDescription[WSADESCRIPTION_LEN+1]; char szSystemStatus[WSASYS_STATUS_LEN+1];//当前库的秒数信息,2.0是第2版的意思 unsigned short iMaxSockets;//返回可用的socket数量,2版本只有就没用了 unsigned short iMaxUdpDg;//UDP数据报信息大小,2版本只有就没用了 char FAR * lpVendorInfo;//供应商特定的信息,2版本只有就没用了 #endif } WSADATA;
当输入的版本不存在:
- 输入1.3、2.3:有主版本,没有副版本
- 得到该主版本的最大副版本1.1、2.2并使用
- 输入3.1、3.3:超过最大版本号
- 使用系统能够提供的最大版本2.2
- 输入0.0、0.1、0.3:主版本是0
- 网络库打开失败,不支持请求的套接字版本
5. 返回值 int
| Error code | Meaning |
|---|---|
| WSASYSNOTREADY | 基础网络子系统尚未准备好进行网络通信。 |
| WSAVERNOTSUPPORTED | 此特定的Windows套接字实现未提供所请求的Windows套接字支持的版本。 |
| WSAEINPROGRESS | Windows Sockets 1.1的阻止操作正在进行中。 |
| WSAEPROCLIM | Windows套接字实现所支持的任务数已达到限制。 |
| WSAEFAULT | lpWSAData 参数不是有效的指针。 |

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/231451.html原文链接:https://javaforall.net
