繁体   English   中英

c ++ / cli检查网络连接

[英]c++/cli Checking Network Connectivity

所以这是代码

public: static bool TcpSocketTest ()
    {
        try
        {
            System::Net::Sockets::TcpClient Client = gcnew System::Net::Sockets::TcpClient ("www.google.com", 80);

            Client.Close ();

            return true;
        }
        catch (System::Exception ^ex)
        {
            return false;
        }
    }

我正在尝试检查网络连接,并在Internet上找到了此代码,并对其进行了一些更改以与我的项目一起工作,但是它说

no suitable user-defined conversion from "System::Net::Sockets::TcpClient ^" to "System::Net::Sockets::TcpClient" exists     Project1   33  

我对此很陌生,所以我不知道自己在做什么。

在C ++ / CLI中,您需要用尾随^声明对象引用,类似于本机指针的*运算符。 而且,引用上的方法大多数是通过->运算符调用的。 尝试这个:

public: static bool TcpSocketTest ()
    {
        try
        {
            System::Net::Sockets::TcpClient^ Client = gcnew System::Net::Sockets::TcpClient ("www.google.com", 80);

            Client->Close ();

            return true;
        }
        catch (System::Exception ^ex)
        {
            return false;
        }
    }

编辑:正如汉斯·帕桑特(Hans Passant)正确指出的那样,此代码还有另一个问题,这不是语法问题。 由于TcpClient实现IDisposable ,并且Close()调用位于try块中,因此在发生异常的情况下永远不会丢弃对象引用。 因此, Close()调用应位于try块之外。

但是,C ++ / CLI提供了一种更好的方法来处理此问题,称为“堆栈语义”。 等效于C# using语句。 它的用法是这样的:

public: static bool TcpSocketTest ()
    {
        try
        {
            System::Net::Sockets::TcpClient Client (L"www.google.com", 80);

            // Dispose() or Close() not needed anymore

            return true;
        }
        catch (System::Exception ^ex)
        {
            return false;
        }
    }

因此, TcpClient引用的声明类似于局部变量。 但是实际上,它将在堆上创建,并且一旦变量Client超出作用域,就会自动调用Client.Dispose () 因此,无论是否引发异常或方法正常终止,都完全不需要Close()调用,并且可以正确处理该对象。

感谢Hans Passant指出这一点。 IDispose堆栈语义是C ++ / CLI中的良好实践。

请注意,我将构造函数中的String文字更改为L"..." 这也是一个好习惯,因为一旦使用8位范围以外的Unicode字符,则省略“ L”将导致问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM