代码之家  ›  专栏  ›  技术社区  ›  r0u1i

是否应始终调用tcpclient.endconnect(即使连接失败?)

  •  0
  • r0u1i  · 技术社区  · 15 年前

    C有几个用于网络任务的有用类,如tcpclient和webclient。两者都有beginx方法(分别为beginconnect和begingeresponse),根据msdn,应该始终后跟endx。两者都接受操作完成后调用的委托。

    但是,假设我们无法建立连接,因此调用这些方法将引发异常。我应该仍然调用各自的endx方法,还是应该首先检查连接是否已建立,然后才调用它们?

    或者,在下面的示例中,我应该使用OnSocketConnected1还是OnSocketConnected2?

    static TcpClient m_client;
    
    private static void OnSocketConnected1 (IAsyncResult asynchronousResult)
    {
      try
      {
        m_client.EndConnect(asynchronousResult);
      }
      catch { }
    }
    
    private static void OnSocketConnected2(IAsyncResult asynchronousResult)
    {
      if (m_client.Connected)
      {
        try
        {
          m_client.EndConnect(asynchronousResult);
        }
        catch { }
      }
    }
    
    static void Main(string[] args)
    {
      m_client = new TcpClient();
      m_client.BeginConnect("http://www.example.com", 555, OnSocketConnected, null);
      Console.ReadLine();
    }
    

    谢谢

    5 回复  |  直到 10 年前
        1
  •  3
  •   Benjamin Podszun    15 年前

    MSDN Quote, TcpClient.BeginConnect

    异步BeginConnect 必须通过调用完成操作 EndConnect方法。通常情况下, 方法由AsyncCallback调用 代表。

    我认为这条规则没有例外。而且您的字段也不重要(阅读:版本1,立即无条件调用endconnect)。

        2
  •  0
  •   Aviad P.    15 年前

    我的直觉会说是的,因为它可能会允许框架 垃圾收集IAsyncResult对象 .

        3
  •  0
  •   Dimi Takis    15 年前
    private static void OnSocketConnected1 (IAsyncResult asynchronousResult)
    {
      try
      {
        m_client.EndConnect(asynchronousResult);
      }
      catch { }
    }
    
        4
  •  0
  •   Jess    15 年前

    我不认为第二个版本会像你想象的那样。connect返回有关最新IO命令的信息。在EndConnect完成之前,您将无法建立连接。

        5
  •  0
  •   Ryan K    10 年前

    从我自己的经验来看 socket.EndConnect() socket.Close() 是无关的。如果连接失败,则 socket.Dispose 方法(在套接字被破坏时将被调用)似乎仍在尝试断开连接。当我呼唤 Dispose() , EndConnect() Close() 或者简单地将插座放入 USING 阻止,我得到同样的行为-一个缓慢的断开而不是一个即时的反应。事实上,我还没有找到一种方法来阻止这种情况的发生,即使我想这样做。