使用 WSAStartup 在没有 wsadata 的情况下初始化 winsock?

问题描述

基本上我想知道是否可以在不创建 WSADATA 变量或将 WSADATA 值直接提供给 WSAStartup 函数的情况下初始化 winsock?

我试过了:

WSAStartup(0x202,NULL);
WSAStartup(0x202,(WSADATA *)0x00);

在上面,套接字失败 recv() 但如果你有的话,它又开始工作了:

WSADATA wsaData;
WSAStartup(0x202,&wsaData);

根据文档,它说“它允许应用程序或 DLL 指定所需的 Windows 套接字版本并检索特定 Windows 套接字实现的详细信息”。那么,我们可以不直接定义一个内存位置来存储返回值吗?

解决方法

基本上我想知道是否可以在不创建 WSADATA 变量或将 WSADATA 值直接提供给 WSAStartup 函数的情况下初始化 winsock?

调用 WSAStartup() 是必需的,否则大多数 Winsock 函数将失败并出现 WSANOTINITIALISED 错误。而 WSAStartup() 本身需要一个指向已分配内存的指针来填充 WSADATA 数据。这不是可选的。

那么,我们可以不直接定义一个内存位置来存储返回值吗?

这正是声明变量的作用。但更一般地说,是的,您当然可以传入任何非 NULL 内存地址,只要它是调用进程内的有效内存地址,并且已分配给 至少 {{1} } 字节数。