public static void ConnectAsync( EndPoint remoteEndPoint, ConnectedCallback callback, object state) { ConnectAsyncExtension.ConnectAsyncInternal(remoteEndPoint, callback, state); }
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); } }
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); } } }
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); } } }
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); } }