示例#1
0
 public static void ConnectAsync(
     EndPoint remoteEndPoint,
     ConnectedCallback callback,
     object state)
 {
     ConnectAsyncExtension.ConnectAsyncInternal(remoteEndPoint, callback, state);
 }
示例#2
0
 private static void ConnectAsyncInternal(
     EndPoint remoteEndPoint,
     ConnectedCallback callback,
     object state)
 {
     if (remoteEndPoint is DnsEndPoint)
     {
         DnsEndPoint  dnsEndPoint   = (DnsEndPoint)remoteEndPoint;
         IAsyncResult hostAddresses = Dns.BeginGetHostAddresses(dnsEndPoint.Host,
                                                                new AsyncCallback(ConnectAsyncExtension.OnGetHostAddresses),
                                                                (object)new ConnectAsyncExtension.DnsConnectState()
         {
             Port     = dnsEndPoint.Port,
             Callback = callback,
             State    = state
         });
         if (!hostAddresses.CompletedSynchronously)
         {
             return;
         }
         ConnectAsyncExtension.OnGetHostAddresses(hostAddresses);
     }
     else
     {
         SocketAsyncEventArgs socketAsyncEventArgs =
             ConnectAsyncExtension.CreateSocketAsyncEventArgs(remoteEndPoint, callback, state);
         new global::System.Net.Sockets.Socket(remoteEndPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp)
         .ConnectAsync(socketAsyncEventArgs);
     }
 }
示例#3
0
 private static void SocketConnectCompleted(object sender, SocketAsyncEventArgs e)
 {
     ConnectAsyncExtension.DnsConnectState userToken = e.UserToken as ConnectAsyncExtension.DnsConnectState;
     if (e.SocketError == SocketError.Success)
     {
         ConnectAsyncExtension.ClearSocketAsyncEventArgs(e);
         userToken.Callback((global::System.Net.Sockets.Socket)sender, userToken.State, e);
     }
     else if (e.SocketError != SocketError.HostUnreachable && e.SocketError != SocketError.ConnectionRefused)
     {
         ConnectAsyncExtension.ClearSocketAsyncEventArgs(e);
         userToken.Callback((global::System.Net.Sockets.Socket)null, userToken.State, e);
     }
     else
     {
         global::System.Net.Sockets.Socket attempSocket;
         IPAddress nextAddress = ConnectAsyncExtension.GetNextAddress(userToken, out attempSocket);
         if (nextAddress == null)
         {
             ConnectAsyncExtension.ClearSocketAsyncEventArgs(e);
             e.SocketError = SocketError.HostUnreachable;
             userToken.Callback((global::System.Net.Sockets.Socket)null, userToken.State, e);
         }
         else
         {
             e.RemoteEndPoint = (EndPoint) new IPEndPoint(nextAddress, userToken.Port);
             if (attempSocket.ConnectAsync(e))
             {
                 return;
             }
             ConnectAsyncExtension.SocketConnectCompleted((object)attempSocket, e);
         }
     }
 }
示例#4
0
        private static void OnGetHostAddresses(IAsyncResult result)
        {
            ConnectAsyncExtension.DnsConnectState asyncState = result.AsyncState as ConnectAsyncExtension.DnsConnectState;
            IPAddress[] hostAddresses;
            try {
                hostAddresses = Dns.EndGetHostAddresses(result);
            } catch {
                asyncState.Callback((global::System.Net.Sockets.Socket)null, asyncState.State, (SocketAsyncEventArgs)null);
                return;
            }

            if (hostAddresses == null || hostAddresses.Length <= 0)
            {
                asyncState.Callback((global::System.Net.Sockets.Socket)null, asyncState.State, (SocketAsyncEventArgs)null);
            }
            else
            {
                asyncState.Addresses = hostAddresses;
                ConnectAsyncExtension.CreateAttempSocket(asyncState);
                global::System.Net.Sockets.Socket attempSocket;
                IPAddress nextAddress = ConnectAsyncExtension.GetNextAddress(asyncState, out attempSocket);
                if (nextAddress == null)
                {
                    asyncState.Callback((global::System.Net.Sockets.Socket)null, asyncState.State, (SocketAsyncEventArgs)null);
                }
                else
                {
                    SocketAsyncEventArgs e = new SocketAsyncEventArgs();
                    e.Completed += new EventHandler <SocketAsyncEventArgs>(ConnectAsyncExtension.SocketConnectCompleted);
                    IPEndPoint ipEndPoint = new IPEndPoint(nextAddress, asyncState.Port);
                    e.RemoteEndPoint = (EndPoint)ipEndPoint;
                    e.UserToken      = (object)asyncState;
                    if (attempSocket.ConnectAsync(e))
                    {
                        return;
                    }
                    ConnectAsyncExtension.SocketConnectCompleted((object)attempSocket, e);
                }
            }
        }
示例#5
0
 public override void Connect()
 {
     if (this.m_InConnecting)
     {
         throw new Exception("The socket is connecting, cannot connect again!");
     }
     if (this.Client != null)
     {
         throw new Exception("The socket is connected, you needn't connect again!");
     }
     if (this.Proxy != null)
     {
         this.Proxy.Completed += new EventHandler <ProxyEventArgs>(this.Proxy_Completed);
         this.Proxy.Connect(this.RemoteEndPoint);
         this.m_InConnecting = true;
     }
     else
     {
         this.m_InConnecting = true;
         ConnectAsyncExtension.ConnectAsync(this.RemoteEndPoint, new ConnectedCallback(this.ProcessConnect),
                                            (object)null);
     }
 }