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. 

所以你的服務器將看到一旦連接和數據。您的取消代碼非常好,只是在您有機會取消任何內容之前發送數據。