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); } } }