C# 客户端套接字无法连接,但不会引发SocketException
我的异步连接代码非常简单,如下所示:C# 客户端套接字无法连接,但不会引发SocketException,c#,sockets,C#,Sockets,我的异步连接代码非常简单,如下所示: private Socket _socket; public void Connect(IPEndPoint remoteEndPoint, bool persistentConnection) { _logger.Trace("Attempting To Connect To " + remoteEndPoint.Address); _remoteEndPoint = remoteEndPoint; _persistentConne
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
似乎成功了,因为即使套接字没有真正连接,我的代码仍继续调用\u socket.BeginReceive
,当然,这会因为套接字没有连接而引发异常
特别奇怪的是,如果我在开头的try
brake上放置一个断点,然后逐步遍历回调代码,就会抛出并处理异常
这在本地主机上发生
为什么我会遇到这种行为?我如何确保
EndConnect
抛出SocketException
连接无法一致建立 只有在\u persistentConnection
为true时,才能从捕获返回。如果没有,您可以调用BeginReceive()
。请编写一个完整的、可运行的示例来演示该行为——还可以尝试更改端口,以确保在您认为自己没有真正运行服务器的情况下,您没有真正运行服务器。显然,c#方法并没有被打破。