Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 客户端套接字无法连接,但不会引发SocketException_C#_Sockets - Fatal编程技术网

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#方法并没有被打破。