C# – 用于登录防火墙的套接字

我写了一个应用程序来自动连接到我们不同的防火墙。 所有这些都使用相同的前端。 我们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到它时,我收到消息:LOGIN,用户名:/密码: 如果我已登录,则会收到LOGOUT,用户名:/密码。

对于我的一半防火墙,这与上述方法完美配合,它似乎不起作用(我一直登录,好像我没有尝试传递凭据)。 我也尝试过

  TcpClient tcpConnection = new TcpClient(myip,myport); 

但是这给出了相同的结果。 它适用于某些防火墙ip。 别人失败了。 它们都在同一个域中。

有没有人知道我如何能够通过这个或我可以采取哪些步骤来解决这个问题,或者可能是某些服务器不接受这种方法的原因,尽管如果我telnet到它,它确实接受了吗?

任何帮助或建议表示赞赏。

提前谢谢了。

当你调用sckSocket.Send(bytData) ,套接字如何知道只发送用用户名和密码初始化的bytData部分? 我有一种感觉, Send()将发送整个1024字节,其中大部分将是0x00字节。 我不希望路由器优雅地处理这个问题。

我已经看到只有生成并发送密码提示后才接受密码的系统。 尝试使用两个单独的请求发送用户名和密码。 如果您的环境可以设置TCP_NODELAY套接字选项以禁用Nagle算法 ,则可能有助于更快地获取用户名字符串。 (除非你分开从密码中发送用户名,否则我不会为此烦恼。)