【问题标题】:Socket.Accept() method is blocking when receiving FTP active mode data connectionSocket.Accept() 方法在接收 FTP 主动模式数据连接时被阻塞
【发布时间】:2015-07-27 22:37:47
【问题描述】:

不确定下面的部分代码是否会有所帮助,但我们遇到了一个问题,该问题仅发生在我们的少数客户端机器上尝试将数据通过 FTP 传输到 FTP 服务器。

我们正在跟踪网络并试图找出这些机器的独特之处。

这里是我们的代码停止的地方:=> listening_sock.Accept();

//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;

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

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

谢谢

【问题讨论】:

  • 您有问题吗?

标签: c# sockets ftp


【解决方案1】:

Socket 默认情况下被创建为阻塞。所以Socket.Accept 确实应该阻塞,直到收到连接请求。

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

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

【讨论】:

  • 是的,Windows 客户端上的防火墙已打开。这很糟糕,因为我在我的 TRY CATCH 块中没有得到任何东西,而客户端只是挂在那里等待和等待......谢谢
  • 这是正确的行为。 Socket 类不知道您希望很快建立连接。典型的 TCP 服务器无休止地等待传入连接。一个活跃的 FTP 连接,在非常特殊的情况下几乎立即需要传入连接。
  • 这太疯狂了,它应该在 FTP 服务器关闭连接后给我一个异常。这是挂起我们的 Windows 服务 :-(
  • 你的意思是FTP控制连接吗?像Socket 这样的低级类怎么可能知道您打开了另一个连接(在相反的方向),您认为它与侦听套接字有某种关系?一旦您选择自己实现 FTP 协议(​​为什么?!?),您必须自己处理所有这些低级特性。如果您希望 .NET 框架为您处理所有这些,请使用现有的 FTP 客户端 (FtpWebRequest),不要尝试构建自己的!
  • 这是一个我们使用 C# ftp 类继承的项目,该类是从开源社区某处的 Java 源代码重写的。我们必须使用它,因为我们需要使用 Active FTP,并且我们需要控制 FTP 服务器可以用来连接回客户端的端口范围。这是几年前的事了,但现在我知道我们可以在 IIS FTP 服务器(端口范围)中控制它,但我们现在没有更改这个项目中的任何内容。
猜你喜欢
  • 2016-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-15
  • 2019-07-10
  • 2010-10-26
  • 1970-01-01
相关资源
最近更新 更多