5

サーバーに接続するWindowsPhoneアプリケーションを開発しています。これは、ログインボタンを押したときにConnectAsyncを使用して行われます。しかし、サーバーがダウンしていて、接続の試行をキャンセルしたい場合は、どうすればよいですか?

これは、ソケット接続をシャットダウンする私の最新の試みで完了した現在のクライアントコードです。接続をオフにする方法がわかれば、タイムアウトを簡単に実装できると想定されます。

    private IPAddress ServerAddress = new IPAddress(0xff00ff00); //Censored my IP
    private int ServerPort = 13000;
    private Socket CurrentSocket;
    private SocketAsyncEventArgs CurrentSocketEventArgs;
    private bool Connecting = false;

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        try
        {
            if (Connecting)
            {
                CurrentSocket.Close();
                CurrentSocket.Dispose();
                CurrentSocketEventArgs.Dispose();
                CurrentSocket = null;
                CurrentSocketEventArgs = null;
            }
            UserData userdata = new UserData();
            userdata.Username = usernameBox.Text;
            userdata.Password = passwordBox.Password;

            Connecting = ConnectToServer(userdata);
        }
        catch (Exception exception)
        {
            Dispatcher.BeginInvoke(() => MessageBox.Show("Error: " + exception.Message));
        }
    }

    private bool ConnectToServer(UserData userdata)
    {
        CurrentSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

        //Create a new SocketAsyncEventArgs
        CurrentSocketEventArgs = new SocketAsyncEventArgs();
        CurrentSocketEventArgs.RemoteEndPoint = new IPEndPoint(ServerAddress, ServerPort);
        CurrentSocketEventArgs.Completed += ConnectionCompleted;
        CurrentSocketEventArgs.UserToken = userdata;
        CurrentSocketEventArgs.SetBuffer(new byte[1024], 0, 1024);

        CurrentSocket.ConnectAsync(CurrentSocketEventArgs);
        return true;
    }

編集:私を驚かせたのは、サーバーソフトウェアがオンになっていない場合でも、要求に応じてスタックするのはサーバーコンピューターである可能性があるということです。それは可能ですか?

4

3 に答える 3

3

私は信じている

socket.Close()

非同期接続の試行をキャンセルする必要があります。結果としてキャッチする必要があるいくつかの例外があるかもしれません。

于 2013-02-15T22:01:28.277 に答える
0

ここで起こっていることは、ConnectAsync への引数でバッファーを指定していることです。

CurrentSocketEventArgs.SetBuffer(new byte[1024], 0, 1024);

ドキュメントには次のように記載されています。

Optionally, a buffer may be provided which will atomically be sent on the socket after the ConnectAsync method succeeds.

したがって、サーバーは接続とデータを一度に確認します。キャンセルコードは問題ありません。キャンセルする前にデータが送信されるだけです。

于 2014-02-20T02:40:56.010 に答える
0

あなたのコードは問題ないようです。すでにマークが言ったように、ソケットを閉じると、保留中のすべての操作がキャンセルされます。

はい、問題なく接続できても何も起こらない場合があります。確認するには、コマンドラインで

telnet 192.168.1.44 31337ここで、192.168.1.44 は ServerAddress (名前でも構いません) で、31337 は ServerPort です。最初に、[コントロール パネル]、[プログラムと機能]、[Windows の機能の有効化と無効化] を使用して "Telnet クライアント" を有効にします。「接続を開けませんでした」と表示された場合、WinForms アプリケーションは接続できないはずです。黒い画面にカーソルが点滅している場合 = WinForms アプリケーションは正常に接続されているはずです。

于 2013-02-16T02:31:02.580 に答える