首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否可以判断进程中是否调用了WSAStartup?

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

Stack Overflow用户
提问于 2009-12-09 04:40:53
回答 2查看 14.5K关注 0票数 17

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

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

如果没有,就调用它。一个小测试显示多次调用WSAStartup是收费的。但是,如果请求不同的winsock版本,会发生什么呢?这会破坏应用程序的其他部分吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-12-09 11:37:40

是的,这是可能的。

这就是它是如何做到的。

代码语言:javascript
复制
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()调用也是安全的。

例如:

代码语言:javascript
复制
// 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
票数 31
EN

Stack Overflow用户

发布于 2009-12-09 09:19:05

  • 否,无法判断WSAStartup()是否已被调用。
  • 可以,只要WinSock DLL支持所请求的版本,就可以在单个进程中多次调用WSAStartup()。对WSAStartup()WSACleanup()的调用必须是balanced.
  • WinSock初始化是一个协商过程;您负责验证WSAStartup()返回的信息,以确保它满足您的应用程序的要求。
  • 现有套接字不受后续WSAStartup()调用的影响。允许使用不同WinSock版本的
  • 多个套接字。

有关详细信息,请参阅the WSAStartup() documentation

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1869689

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档