是否可以判断进程中是否调用了 WSAStartup?

发布于 2024-08-13 22:10:49 字数 188 浏览 6 评论 0原文

我已经开始编写一个使用套接字的 ActiveX 控件。

使用此控件的应用程序可能也可能不使用套接字。 我的控件是否可以判断 WSAStartup 是否已被调用?

如果没有,请调用它。一个小测试表明,多次调用 WSAStartup 是有问题的。 但是如果请求不同的 winsock 版本会发生什么情况?这会破坏应用程序的其他部分吗?

I've started writing an ActiveX control that makes use of sockets.

Applications that use this control may or may not also use sockets.
Is it possible for my control to tell whether WSAStartup has been called?

If not, call it. A little test reveals that calling WSAStartup multiple times is tollerated.
But what happens if a different winsock version is requested? will this break other parts of the application?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

囚你心 2024-08-20 22:10:49

是的,这是可能的。

这是如何完成的。

bool WinsockInitialized()
{
    SOCKET s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (s == INVALID_SOCKET){
        return false;
    }

    closesocket(s);
    return true;
}

int main()
{
    //...
    if ( !WinsockInitialized() )
       // Init winsock here...

    // Carry on as normal.
    // ...         
}

但实际上没有必要这样做。随时调用 WSAStartup 都是非常安全的。通过对 WSACleanup() 的匹配调用来结束对 WSAStartup() 的每次成功调用也是安全的。

例如

// socket calls here would be an error, not initialized
WSAStartup(...)
// socket calls here OK

WSAStartup(...)
// more socket calls OK

WSACleanup()
// socket calls OK

WSACleanup()

// more socket calls error, not initialized

Yes it is possible.

And here is how it's done.

bool WinsockInitialized()
{
    SOCKET s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (s == INVALID_SOCKET){
        return false;
    }

    closesocket(s);
    return true;
}

int main()
{
    //...
    if ( !WinsockInitialized() )
       // Init winsock here...

    // Carry on as normal.
    // ...         
}

But it's not really necessary to do this. It's quite safe to call WSAStartup at any time. It's also safe to end each successful call to WSAStartup() with a matching call to WSACleanup().

e.g.

// socket calls here would be an error, not initialized
WSAStartup(...)
// socket calls here OK

WSAStartup(...)
// more socket calls OK

WSACleanup()
// socket calls OK

WSACleanup()

// more socket calls error, not initialized
终陌 2024-08-20 22:10:49
  • 不,无法判断 WSAStartup() 是否已被调用。

  • 是的,只要 WinSock DLL 支持请求的版本,就可以在单个进程中多次调用 WSAStartup()。对 WSAStartup()WSACleanup() 的调用必须平衡。

  • WinSock初始化是一个协商的过程;您负责验证 WSAStartup() 返回的信息,以确保它满足您的应用的要求。

  • 现有套接字不受后续 WSAStartup() 调用的影响。

  • 允许使用不同 WinSock 版本的多个套接字。

请参阅WSAStartup() 文档< /a> 了解更多信息。

  • No, it is not possible to tell if WSAStartup() has already been called.

  • Yes, WSAStartup() can be called multiple times in a single process, as long as the requested version is supported by the WinSock DLL. Calls to WSAStartup() and WSACleanup() must be balanced.

  • WinSock initialization is a negotiated process; you are responsible for validating the info that WSAStartup() returns to make sure it meets your app's requirements.

  • Existing sockets are not affected by subsequent WSAStartup() calls.

  • Multiple sockets using different WinSock versions is allowed.

See the WSAStartup() documentation for more information.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文