C# FTP双网卡问题-Socket

本文介绍了在使用C#进行FTP操作时遇到的由于电脑配置多网卡导致的501错误。问题源于服务器通过局域网地址响应PORT命令,解决方案是验证并使用非局域网的IP地址来发送PORT命令。
摘要由CSDN通过智能技术生成

1.问题描述:

远程访问FTP服务器报错: 501 Server cannot accept argument.
在这里插入图片描述

2.原因:

我的电脑是多网口,且其它网口也连接有设备
在这里插入图片描述

3.验证IP是否为局域网地址

原文: https://zhuanlan.zhihu.com/p/136537441

 // 验证IP是否为局域网地址
        bool IsPrivateNetwork3(string ipv4Address)
        {
            if (IPAddress.TryParse(ipv4Address, out var ip))
            {
                byte[] ipBytes = ip.GetAddressBytes();
                if (ipBytes[0] == 10) return true;
                if (ipBytes[0] == 172 && ipBytes[1] >= 16 && ipBytes[1] <= 31) return true;
                if (ipBytes[0] == 192 && ipBytes[1] == 168) return true;
            }

            return false;
        } 

4.使用局域网地址IP发送PORT命令

        [Obsolete]
        private void CreateDataListener(ref TcpListener listener)
        {
            IPAddress localaddr = Dns.Resolve(Dns.GetHostName()).AddressList[0];//Dns.Resolve(Dns.GetHostName()).AddressList[0];
            foreach (IPAddress _IPAddress in Dns.GetHostEntry(Dns.GetHostName()).AddressList)
             {
                 if (_IPAddress.AddressFamily.ToString() == "InterNetwork")
                 { 
                     string AddressIP = _IPAddress.ToString();   //获取本地的IP地址
                    if (IsPrivateNetwork3(AddressIP)) //验证IP是否为局域网地址
                    {
                        localaddr = _IPAddress;   
                    } 
                 }
             } 
            listener = new TcpListener(localaddr, 0);
            listener.Start();
            IPEndPoint localEndpoint = (IPEndPoint) listener.LocalEndpoint;
            int num = localEndpoint.Port >> 8;
            int num2 = localEndpoint.Port & 0xff;
            this.SendCommand("PORT " + localEndpoint.Address.ToString().Replace(".", ",") + "," + num.ToString() + "," + num2.ToString());
            if ((this.mIntReplyCode != 200) && (this.mIntReplyCode != 0xe2))
            {
                throw new IOException(this.mStrReply.Substring(4));
            }
        }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值