加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

窗口 – 可以判断一个进程中是否已经调用了WSAStartup?

发布时间:2020-12-13 20:11:12 所属栏目:Windows 来源:网络整理
导读:我开始编写一个使用套接字的ActiveX控件. 使用此控件的应用程序可能也可能不使用套接字. 我的控制是否可以告诉WSAStartup是否已被调用? 如果不是,叫它.有一点测试显示,多次调用WSAStartup. 但是如果请求不同的winsock版本会怎么样?这会打破其他部分的应用
我开始编写一个使用套接字的ActiveX控件.

使用此控件的应用程序可能也可能不使用套接字.
我的控制是否可以告诉WSAStartup是否已被调用?

如果不是,叫它.有一点测试显示,多次调用WSAStartup.
但是如果请求不同的winsock版本会怎么样?这会打破其他部分的应用程序吗?

是的,这是可能的.

这里是如何做的.

bool WinsockInitialized()
{
    SOCKET s = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
    if (s == INVALID_SOCKET && WSAGetLastError() == WSANOTINITIALISED){
        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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读