Socket.Accept() 方法在接收 FTP 主动模式数据连接时阻塞
Socket.Accept() method is blocking when receiving FTP active mode data connection
不确定下面的部分代码是否有帮助,但我们遇到了一个问题,这个问题只发生在我们的一些客户端机器上,试图 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;
在这里我们可以看到发送端口命令成功(活动 FTP)但服务器响应 425:
我最好的选择是防火墙。我也在查。
谢谢
Socket
默认创建阻塞。所以 Socket.Accept
确实应该阻塞,直到收到连接请求。
我假设问题不在代码中,但请求实际上并没有到来,原因可能是:
- 它被防火墙阻止了
- 或者您的 NAT 配置不正确
- 或者您向服务器提供了错误的 IP 地址或端口号。
不确定下面的部分代码是否有帮助,但我们遇到了一个问题,这个问题只发生在我们的一些客户端机器上,试图 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;
在这里我们可以看到发送端口命令成功(活动 FTP)但服务器响应 425:
我最好的选择是防火墙。我也在查。
谢谢
Socket
默认创建阻塞。所以 Socket.Accept
确实应该阻塞,直到收到连接请求。
我假设问题不在代码中,但请求实际上并没有到来,原因可能是:
- 它被防火墙阻止了
- 或者您的 NAT 配置不正确
- 或者您向服务器提供了错误的 IP 地址或端口号。