我写了一个应用程序来自动连接到我们的不同防火墙。他们都使用相同的前端。我们通过telnet到IP,他们给消息LOGIN或LOGOUT并询问用户名或密码。
我使用了以下代码:
public static void ConnectToFirewall(string strUsername, string strPassword, string strFirewallIp)
{
IPAddress[] ipaIpAddressCollection = Dns.GetHostAddresses(strFirewallIp);
IPEndPoint ipeIpEndPoint = new IPEndPoint(ipaIpAddressCollection[0], intPort);
Socket sckSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
sckSocket.Connect(ipeIpEndPoint);
string strData = strUsername + "\r\n"+ strPassword + "\r\n";
byte[] bytData = new byte[1024];
bytData = Encoding.ASCII.GetBytes(strData);
sckSocket.Send(bytData);
byte[] bytDataReceived = new byte[1024];
int intData = sckSocket.Receive(bytDataReceived);
sckSocket.Close();
}
如果我未登录,则通过telnet登录时,会收到以下消息:登录,用户名:/密码:。
如果我登录,则收到LOGOUT,用户名:/密码。
对于上面一半的防火墙,上述方法都可以很好地工作,但似乎不起作用(我一直在登录,好像没有尝试通过凭据一样)。
我也尝试过
TcpClient tcpConnection = new TcpClient(myip,myport);
但这给出了相同的结果。它适用于某些防火墙IP。为别人失败。它们都在同一个域中。
是否有人知道我将如何解决这个问题,或者我可以采取什么步骤来解决此问题,或者是某些服务器不接受此方法的原因(尽管如果我通过telnet接受了该方法也可以)是什么原因?
任何帮助或建议,表示赞赏。
提前谢谢了。
最佳答案
当您调用sckSocket.Send(bytData)
时,套接字如何知道仅发送bytData
中用用户名和密码初始化的部分?我有一种感觉,Send()
将发送整个1024
字节,其中大部分将是0x00
字节。我不希望路由器能够正常处理此问题。
我见过只有在生成并发送密码提示后才接受密码的系统。尝试通过两个单独的请求发送用户名和密码。如果您的环境允许将TCP_NODELAY
套接字选项设置为禁用Nagle's algorithm可行,则可能有助于更快地发送用户名字符串。 (除非您也将发送用户名和密码分开,否则我不会为此而烦恼。)
关于c# - C#-登录到防火墙的套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8115864/