4

我正在开发将连接到我的服务器的Windows Phone应用程序。它通过在按下登录按钮时使用ConnectAsync来实现。但是,如果服务器关闭并且您想取消连接尝试,该怎么办?如何(确实)取消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; 
    } 

编辑:让我吃惊一个念头是,也许它是在请求堆叠起来的服务器计算机即使服务器软件是不是?那可能吗?

回答

3

我相信

socket.Close() 

应该取消异步连接尝试。可能会有一些例外需要被捕获。

+0

那不是我已经做了什么吗?我对异常没有任何问题,只是它们在后台堆叠,无论我使用CurrentSocket.Close()。一旦我打开服务器,它就会同时收到大量的请求。 – Switchice 2013-02-15 23:31:05

+0

我相信我的回答解决了您的主要问题。你还有什么麻烦? – MarcF 2013-02-16 15:09:56

+0

这就是即使当我使用CurrentSocket.Close(),如代码中所示,请求堆积起来。它似乎没有工作,为什么呢? – Switchice 2013-02-16 16:35:48

0

您的代码看起来不错。正如Marc已经说过的那样,关闭套接字将取消所有挂起的操作。

是的,有时候您可能会连接好而没有任何反应。要验证,在命令行

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

+0

谢谢你的答复,非常感谢。问题不在于连接,而是连接没有错误。当我通过CurrentSocket.Close()告诉它时,代码似乎不想停止。看起来好像请求被以某种方式堆叠起来,无论如何... – Switchice 2013-02-16 16:42:11

+0

你怎么知道它并没有停止?顺便说一下,为什么连接后立即发送1024个零字节? – Soonts 2013-02-16 17:26:48

+0

我知道它不会停止,因为当我打开服务器时,对于每次点击,都有一条由服务器写入的“连接到套接字”的行。如果我写新的字节[1024]发送了一千个零,这将解释很多。我认为它不会发送,直到我开始一个SendAsync呼叫到套接字... – Switchice 2013-02-18 13:15:13

0

这里发生了什么事情是您在ConnectAsync的参数中指定了一个缓冲区。

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

documentation说:

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

所以你的服务器将看到一旦连接和数据。您的取消代码非常好,只是在您有机会取消任何内容之前发送数据。