C# 接收FTP活动模式数据连接时,Socket.Accept()方法被阻塞

C# 接收FTP活动模式数据连接时,Socket.Accept()方法被阻塞,c#,sockets,ftp,C#,Sockets,Ftp,不确定下面的部分代码是否有帮助,但我们遇到了一个问题,这个问题只发生在少数尝试将数据FTP到FTP服务器的客户机上 我们正在进行网络跟踪,并试图找到这些机器的任何独特之处 下面是我们的代码停止的地方:=>侦听_sock.Accept() 在这里,我们可以看到发送端口命令成功(活动FTP),但服务器响应425: 我最好的选择是防火墙。我也在检查 谢谢默认情况下会创建套接字。因此,在接收到连接请求之前,确实应该阻塞 我假设问题不在代码中,但请求实际上没有出现,或者是因为: 它被防火墙阻止了 或者

不确定下面的部分代码是否有帮助,但我们遇到了一个问题,这个问题只发生在少数尝试将数据FTP到FTP服务器的客户机上

我们正在进行网络跟踪,并试图找到这些机器的任何独特之处

下面是我们的代码停止的地方:=>
侦听_sock.Accept()

在这里,我们可以看到发送端口命令成功(活动FTP),但服务器响应425:

我最好的选择是防火墙。我也在检查


谢谢

默认情况下会创建
套接字
。因此,在接收到连接请求之前,确实应该阻塞

我假设问题不在代码中,但请求实际上没有出现,或者是因为:

  • 它被防火墙阻止了
  • 或者NAT配置不正确
  • 或者您向服务器提供了错误的IP地址或端口号

您有问题吗?是的,windows客户端的防火墙已打开。这太糟糕了,因为我在TRY-CATCH块中没有得到任何东西,而客户只是挂在那里等啊等。。。。谢谢,这是正确的行为。
Socket
类不知道您希望很快建立连接。典型的TCP服务器无休止地等待传入的连接。一个活动的FTP连接,在一个非常特殊的情况下,它几乎立即期望传入连接。这太疯狂了,它应该在FTP服务器关闭连接后给我一个异常。这是挂着我们的Windows服务:-(你是指FTP控制连接吗?一个低级类,比如<代码> Socket < /Cube >怎么可能知道你有另一个打开的连接(在相反的方向上),你认为它与侦听套接字有某种联系?一旦你选择了自己来执行FTP协议(为什么???),您必须自己处理所有这些低级特性。如果您希望.NET framework为您处理所有这些特性,请使用现有的FTP客户端(),不要尝试构建自己的!这是一个我们使用C#ftp类继承的项目,该类是从开源社区的某个Java源代码中重新编写的。我们必须使用它,因为我们需要使用活动ftp,我们需要控制ftp服务器可以用来连接回客户端的端口范围。这是几年前的事了,但现在我我们知道我们可以在IIS FTP服务器(端口范围)中控制它,但是我们现在不会在这个项目中更改任何内容。
//region Try to bind to an available data port
System.Net.IPEndPoint localEP = new IPEndPoint(IPAddress.Parse(sIPAddr), (dataPortStart == 0 ? 0 : GetFreePort(dataPortStart, dataPortEnd)));
listening_sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
listening_sock.Bind(localEP);
Log.WriteLine("Listening sock bound to IP Address:" + localEP.Address.ToString() + " on port " + localEP.Port.ToString());

//port 20
if (data_sock != null)      // already connected (always so if passive mode)
return;

data_sock = listening_sock.Accept();    // Accept is blocking
listening_sock.Close();
listening_sock = null;