是否可以判断进程中是否已调用 WSAStartup? [英] Is it possible to tell if WSAStartup has been called in a process?

查看:46
本文介绍了是否可以判断进程中是否已调用 WSAStartup?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

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

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

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?

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

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?

推荐答案

是的,这是可能的.

这是怎么做的.

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() 的每次成功调用也是安全的.

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().

例如

// 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

这篇关于是否可以判断进程中是否已调用 WSAStartup?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆