我的異步連接的代碼是非常基本的,並且如下:客戶端套接字無法連接,但不拋出SocketException
private Socket _socket;
public void Connect(IPEndPoint remoteEndPoint, bool persistentConnection)
{
_logger.Trace("Attempting To Connect To " + remoteEndPoint.Address);
_remoteEndPoint = remoteEndPoint;
_persistentConnection = persistentConnection;
_socket = new Socket(AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);
_socket.BeginConnect(_remoteEndPoint, ConnectCallback, null);
}
的Connect()
方法是伴隨着ConnectCallback()
這是在那裏我將描述該問題很快出現:
private void ConnectCallback(IAsyncResult asyncResult)
{
try
{
_socket.EndConnect(asyncResult);
_logger.Trace("Successfully Connected To " + _remoteEndPoint.Address);
}
catch (SocketException)
{
_logger.Trace("Failed To Connect To " + _remoteEndPoint.Address);
if (_persistentConnection)
{
Thread.Sleep(TimeSpan.FromSeconds(3));
Connect(_remoteEndPoint, true);
return;
}
}
_socketWriter.AssignSocket(_socket);
_socket.BeginReceive(..);
}
我的網絡代碼在單個組件內封裝。今天我決定從另一個應用程序中引用程序集,發現ConnectCallback
方法的行爲非常奇怪。
當服務器應用程序未運行時,我打電話給Connect()
。這意味着連接成功的可能性不大。由於遠程端點不可用,我期望EndConnect
會引發異常。相反,EndConnect
似乎成功,因爲即使套接字沒有真正連接,我的代碼仍會繼續調用_socket.BeginReceive
,這當然會引發異常,因爲套接字未連接。
特別奇怪的是,如果我在開頭try
大括號處放置一箇中斷點並逐步執行回調代碼,則引發和處理異常。
這發生在本地主機上。
爲什麼我遇到這種行爲,我如何確保EndConnect
引發SocketException
連接是否無法一致建立?
請將一個完整的,可運行的示例演示這種行爲 - 也嘗試更改端口,以確保當您不認爲自己是真正運行服務器時。很明顯,C#方法沒有被破壞。 – xaxxon