5

我正在开发一个将连接到我的服务器的 Windows Phone 应用程序。当您按下登录按钮时,它通过使用 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

您的代码看起来不错。正如 Marc 所说,关闭套接字会取消所有挂起的操作。

是的,有时您连接正常但没有任何反应。要验证,在命令行中

telnet 192.168.1.44 31337其中 192.168.1.44 是 ServerAddress(名称也可以),31337 是 ServerPort。您可能首先使用控制面板/程序和功能/打开和关闭 Windows 功能启用“Telnet 客户端”。如果您看到“无法打开连接”= 您的 WinForms 应用程序应该无法连接。如果您看到带有闪烁光标的黑屏 = 您的 WinForms 应用程序应该可以正常连接。

于 2013-02-16T02:31:02.580 回答