使用C#套接字连接Ubuntu(端口23,telnet)可以';我没有收到提示
我是C#的新手,我只是想用C#来编写一个客户端,它将远程登录Ubuntu服务器并登录到这个服务器。我使用Putty或windows cmd登录到此服务器,响应如下所示: ------------------Welcome to syseng1-------------------- This machine is the System Engineering Automation Server -------------------------------------------------------- Ubuntu 8.04.3 LTS syseng1 login: ------------------欢迎来到syseng1-------------------- 这台机器是系统工程自动化服务器 -------------------------------------------------------- Ubuntu 8.04.3 LTS syseng1登录: 但是,当我使用C#async socket尝试登录到此服务器时,我无法接收上面显示的最后两行 这是我的密码:使用C#套接字连接Ubuntu(端口23,telnet)可以';我没有收到提示,c#,C#,我是C#的新手,我只是想用C#来编写一个客户端,它将远程登录Ubuntu服务器并登录到这个服务器。我使用Putty或windows cmd登录到此服务器,响应如下所示: ------------------Welcome to syseng1-------------------- This machine is the System Engineering Automation Server ---------------------------------------------------
private void OnRecievedData(IAsyncResult ar)
{
// Get The connection socket from the callback
Socket sock = (Socket)ar.AsyncState;
// Get The data , if any
int nBytesRec = sock.EndReceive(ar);
if (nBytesRec > 0)
{
// Decode the received data
//byte[] buf = Encoding.Convert(Encoding.UTF8, Encoding.UTF8, m_byBuff, 0, nBytesRec);
// String sRecieved = Encoding.UTF8.GetString(m_byBuff, 0, nBytesRec);
// string sRecieved = Encoding.GetEncoding("utf-8").GetString(m_byBuff, 0, nBytesRec);
string sRecieved = "";
for (int i = 0; i < nBytesRec; i++)
{
Char ch = Convert.ToChar(m_byBuff[i]);
switch (ch)
{
case '\r':
sRecieved += Convert.ToString("\r\n");
break;
case '\n':
break;
default:
sRecieved += Convert.ToString(ch);
break;
}
}
// Console.WriteLine(sRecieved);
strWorkingData += sRecieved;
strFullLog += sRecieved;
richbox.Invoke(new UpdateTextCallback(this.UpdateText), sRecieved);
// Launch another callback to listen for data
//AsyncCallback recieveData = new AsyncCallback(OnRecievedData);
sock.BeginReceive(m_byBuff, 0, m_byBuff.Length, SocketFlags.None, OnRecievedData, sock);
}
else
{
// If no data was recieved then the connection is probably dead
Console.WriteLine("Disconnected", sock.RemoteEndPoint);
sock.Shutdown(SocketShutdown.Both);
sock.Close();
//Application.Exit();
}
}
接收数据时的私有无效(IAsyncResult ar)
{
//从回调函数获取连接套接字
Socket sock=(Socket)ar.AsyncState;
//获取数据,如果有的话
int nBytesRec=sock.EndReceive(ar);
如果(nBytesRec>0)
{
//对接收到的数据进行解码
//字节[]buf=Encoding.Convert(Encoding.UTF8,Encoding.UTF8,m_byBuff,0,nBytesRec);
//String sRecieved=Encoding.UTF8.GetString(m_byBuff,0,nBytesRec);
//string sRecieved=Encoding.GetEncoding(“utf-8”).GetString(m_byBuff,0,nBytesRec);
字符串sRecieved=“”;
对于(int i=0;i
我还尝试使用ruby查找使用socket登录此服务器时收到的确切信息。以下是我的日志:
Microsoft Windows XP [Version 5.1.2600]
(C) Copyright 1985-2001 Microsoft Corp.
C:\Documents and Settings\vzheng>irb
irb(main):001:0> require 'socket'
=> true
irb(main):002:0> include Socket::Constants
=> Object
irb(main):003:0> socket = Socket.new( AF_INET, SOCK_STREAM, 0 )
=> #
irb(main):004:0> sockaddr = Socket.sockaddr_in( 23, '10.4.0.50'
=> "\002\000\000\027\n\004\0002\000\000\000\000\000\000\000\000
irb(main):005:0> socket.connect( sockaddr )
=> 0
irb(main):006:0>
irb(main):007:0* socket.gets
=> "------------------Welcome to syseng1--------------------\r\
irb(main):008:0> socket.gets
=> "This machine is the System Engineering Automation Server\r\
irb(main):009:0> socket.read(40)
=> "----------------------------------------"
irb(main):010:0> socket.read(2)
=> "--"
irb(main):011:0> socket.read(2)
=> "--"
irb(main):012:0> socket.read(2)
=> "--"
irb(main):013:0> socket.read(2)
=> "--"
irb(main):014:0> socket.read(2)
=> "--"
irb(main):015:0> socket.read(2)
=> "--"
irb(main):016:0> socket.read(2)
=> "--"
irb(main):017:0> socket.read(2)
=> "--"
irb(main):018:0> socket.read(2)
=> "\r\n"
irb(main):019:0> socket.read(2)
=> "\377\375"
irb(main):020:0> socket.read(1)
=> "'"
irb(main):021:0> socket.read(1)
(hang there)...
Microsoft Windows XP[版本5.1.2600]
(C) 版权所有1985-2001微软公司。
C:\Documents and Settings\vzheng>irb
irb(主):001:0>需要“插座”
=>正确
irb(主):002:0>包含套接字::常量
=>对象
irb(main):003:0>socket=socket.new(AF\u INET,SOCK\u STREAM,0)
=> #
irb(主):004:0>sockaddr=Socket.sockaddr_英寸(23,'10.4.0.50'
=>“\002\000\000\027\n\004\0002\000\000\000\000\000\000\000\000\000
irb(主):005:0>socket.connect(sockaddr)
=> 0
irb(主要):006:0>
irb(主):007:0*socket.get
=>“--------------欢迎使用syseng1-------------------\r\
irb(main):008:0>socket.get
=>“此计算机是系统工程自动化服务器\r\n\
irb(主):009:0>插座。读取(40)
=> "----------------------------------------"
irb(主):010:0>插座。读取(2)
=> "--"
irb(主):011:0>套接字。读取(2)
=> "--"
irb(主):012:0>插座。读取(2)
=> "--"
irb(主):013:0>插座。读取(2)
=> "--"
irb(主):014:0>套接字。读取(2)
=> "--"
irb(主):015:0>套接字。读取(2)
=> "--"
irb(主):016:0>插座。读取(2)
=> "--"
irb(主):017:0>套接字。读取(2)
=> "--"
irb(主):018:0>套接字。读取(2)
=>“\r\n”
irb(主):019:0>socket.read(2)
=> "\377\375"
irb(主):020:0>插座。读取(1)
=> "'"
irb(主):021:0>插座。读取(1)
(挂在那里)。。。
因此,无论是c#还是ruby中的socket,我只能接收前三行,但无法接收后续行
Ubuntu 8.04.3 LTS
syseng1 login:
Ubuntu 8.04.3 LTS
syseng1登录:
你们能告诉我一些关于这个问题的想法吗?Telnet是一个协议(正如你们的所证明的那样“\002\000\000\027\n\004\0002\000\000\000\000\000\000\000\000\000”
输出)。这意味着登录提示不会自动出现。通常,发送一个(或两个)回车会得到登录提示,但可能会出现(或可能不)是该议定书的一部分
换句话说,您需要实现telnet协议才能实现此功能。非常感谢您的回复。但我尝试发送回车。仍然没有任何响应。因此,这意味着我不知道何时应该将用户名和密码发送到服务器。我还使用Tcl登录到同一服务器,发现服务器响应使用PrompExpect“login”登录,尝试10.4.0.50…连接到10.4.0.50。转义字符为“^]”。欢迎使用syseng1------------------此计算机是系统工程自动化服务器-------------------------------------------------------Ubuntu 8.04.3 LTS syseng1登录:%set expect\u out(缓冲区)正在尝试10.4.0.50…连接到10.4.0.50。转义字符为“^]”。-------------欢迎使用syseng1------------------这台机器是系统工程自动化服务器-------------------------------------------Ubuntu 8.04.3 LTS syseng1 loginalso,搜索“expect”,您会发现它适用于许多进程这对编写程序没有帮助