【问题标题】:using C# socket to connect Ubuntu( port 23 ,telnet) can't recieve the Prompt使用 C# 套接字连接 Ubuntu(端口 23,telnet)无法收到提示
【发布时间】:2010-10-13 19:22:35
【问题描述】:

我是 C# 的新手,只是尝试使用 C# 编写一个客户端,该客户端将远程登录 Ubuntu 服务器并登录到该服务器。我使用 Putty 或 windows cmd 登录到这个服务器,响应是这样的:

------------------欢迎来到syseng1-------------------- 这台机器是系统工程自动化服务器 -------------------------------------------------- ------ Ubuntu 8.04.3 LTS syseng1 登录:

但是当我使用 C# async socket 尝试登录到这个服务器时,我无法接收如上所示的最后两行。

这是我的代码:

 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();
        }
    }

我还尝试使用 ruby​​ 来查找如果我使用套接字登录此服务器时收到的确切信息。这是我的日志:

Microsoft Windows XP [版本 5.1.2600] (C) 版权所有 1985-2001 Microsoft Corp. C:\Documents and Settings\vzheng>irb irb(main):001:0> 需要 'socket' => 真 irb(main):002:0> 包括 Socket::Constants => 对象 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(主):006:0> irb(main):007:0* socket.gets => "--------------------欢迎来到 syseng1--------\r\ irb(main):008:0> socket.gets => "这台机器是系统工程自动化服务器\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) (挂在那里)...

所以无论是c#还是ruby的socket,我只能收到前三行,但我不能收到后面的行。

Ubuntu 8.04.3 LTS syseng1 登录:

你们能不能给我一些关于这个问题的想法?

【问题讨论】:

    标签: c#


    【解决方案1】:

    Telnet 是一种协议(正如您的 "\002\000\000\027\n\004\0002\000\000\000\000\000\000\000\000" 输出所证明的那样)。这意味着登录提示不会自动出现。通常,发送一个(或两个)回车会得到登录提示,但可能(也可能不是)该协议的一部分。

    换句话说,您需要实现 telnet 协议才能完成这项工作。

    【讨论】:

    • 非常感谢您的回复。但我尝试发送回车。仍然没有任何回应。所以这意味着我不知道什么时候应该将我的用户名和密码发送到服务器。
    • 我也是用Tcl登录同一个服务器,发现服务器响应提示符
    • 期望“登录”尝试 10.4.0.50... 连接到 10.4.0.50。转义字符是 '^]'。 ------------------Welcome to syseng1-------------------- 这台机器是系统工程自动化服务器 - -------------------------------------------------- ----- Ubuntu 8.04.3 LTS syseng1 login: % set expect_out(buffer) Trying 10.4.0.50... 连接到 10.4.0.50。转义字符是 '^]'。 ------------------Welcome to syseng1-------------------- 这台机器是系统工程自动化服务器 - -------------------------------------------------- ----- Ubuntu 8.04.3 LTS syseng1 登录
    • 另外,搜索“expect”,你会发现它适用于许多这样的进程(从命令行)。对编写程序没有帮助
    猜你喜欢
    • 2016-09-12
    • 2010-11-14
    • 2020-02-27
    • 2012-10-23
    • 2014-02-09
    • 1970-01-01
    • 2012-02-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多