2016-04-10 34 views
1

因爲我不熟悉C#中的套接字,所以我在Github上使用庫來連接服務器。用於建立連接的語法就是:第一次斷開套接字

Connector con = new Connector(ip, port, cipher); 
con.Connect(); 

的加密參數僅僅是形式的加密服務器使用,是不相關的我的問題,我想。

在我調用Connect()方法之後,庫會產生一個異步socked,我不太確定之後會發生什麼。我的問題是,當我構建我的應用程序並嘗試連接到服務器時,我經常在第一次嘗試時斷開連接。然後,如果我嘗試再次連接該程序正常工作。我能夠追查問題的源頭socket.BeginReceive這裏的回調方法:

private void Receive() { 
    if (m_connected) { 
     var error = SocketError.Success; 

     m_socket.BeginReceive(m_recvBuffer, 0, ReceiveSize, SocketFlags.None, out error, PacketCallback, null); 

     if (error != SocketError.Success) { 
      Disconnect(); 
     } 
    } 
} 

private void PacketCallback(IAsyncResult iar) { 
    if (m_connected) { 
     var error = SocketError.Success; 
     int length = m_socket.EndReceive(iar, out error); 

     if (length == 0 || error != SocketError.Success) { 
      Disconnect(); 
     } 
     else { 
      Append(length); 
      ManipulateBuffer(); 
      Receive(); 
     } 
    } 
} 

socket.EndReceive將返回長度爲0,這是造成計劃與SocketError.ConnectionReset斷開。我似乎無法弄清楚爲什麼它只發生在我的第一次連接嘗試。每個後續連接嘗試都能正常工作熟悉套接字的人可以告訴我它是否是庫代碼中的錯誤,並且可以修復?如果不是,我只需要假定它在服務器端是錯誤的。謝謝。


+0

你連接了什麼服務器?你是如何確保服務器不斷開的? – usr

+0

@usr這正是我想知道的。我無法知道服務器是否斷開我的連接。這就是爲什麼如果我知道圖書館沒有任何問題,我可以得出結論,這個問題已經超出了我的控制範圍。 – Andrew

+0

好吧,編寫你自己的socket程序來做到這一點。使用同步IO。如果你不需要完全正確而只是一個測試,那麼做到這一點非常簡單。 – usr

回答

-1

請勿使用套接字助手。套接字在.net中使用非常簡單。

在此MSDN例子看看:https://msdn.microsoft.com/en-us/library/bew39x2a(v=vs.110).aspx

使用的代碼在上面的鏈接。希望它能爲你工作。

+0

???套接字超級難以使用。有無數可能的錯誤,我每天都看到屠殺。這個答案告訴我,你從來沒有寫過一個正確的套接字應用程序。另外,這不是一個答案。 – usr

+0

立即查看此MSDN示例。這是最可怕的MSDN樣本之一。這段代碼是令人憎惡的。 – usr

+0

我不這麼認爲.net上的套接字是超級困難的。有很多幫助scokets的幫助。超硬是你無法找到它的幫助:) – Saif