在 Windows 上,'socket()'调用何时返回 WSAEPROVIDERFAILEDINIT?



假设我们的客户端应用程序执行以下操作:

WSADATA wsa_data;
int     ret;
SOCKET  sock;
ret = WSAStartup (MAKEWORD (2, 2), &wsa_data);
if (ret ==0) {
sock = socket (AF_INET6, SOCK_DGRAM, IPROTO_UDP);
}

sock == INVALID_SOCKETWSAGetLastError()何时返回WSAEPROVIDERFAILEDINIT

微软关于socket()函数的文档称,当时,它可以返回WSAEPROVIDERFAILEDINIT

服务提供程序初始化失败。如果分层服务提供程序(LSP(或命名空间提供程序安装不正确,或者提供程序无法正常运行,则会返回此错误。

非自定义服务提供程序的TCP/IP传输服务提供程序是否会在socket()调用期间初始化失败?如果是,为什么?在什么情况下?如何补救?

默认提供程序可能永远不会发生这种情况,第三方提供程序也不太可能发生这种情况。

如果Windows本身无法加载提供程序,或者找不到WSPStartup或更可能是NSPStartup导出的函数,则可以返回WSAEPROVIDERFAILEDINIT。我不确定这是否只能在WSAStartup期间发生,或者是否允许Windows将此调用延迟到需要提供程序时。

提供者本身可能在任何时候都会因WSAEPROVIDERFAILEDINIT而失败。想象一下,一个LSP记录每个连接,但无论出于何种原因,它所使用的数据库都有问题,它可能会选择使套接字失败并出现此错误。

(所有这些都是猜测,除非你有理由,否则你不应该以特定的方式处理每个可能的错误。(

例如,当试图将第三方提供程序加载到受Windows保护的进程中时,可能会发生这种情况。Microsoft只允许加载由Microsoft签名或使用特殊证书签名的DLL。情况并非总是如此。

最新更新