当前位置:编程学习 > C#/ASP.NET >>

C#应用telnet问题

我是用这种方法连接telnet的
                
//建立链接
//IP地址或网址
string ipstr = "某IP地址";
string portstr = "某端口号";
Socket st = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
st.Connect(ipstr, Convert.ToInt16(portstr));

但是再发命令的时候我不知道该怎么去做了,我的代码如下
if (st.Connected)
                {
                    //取回连接消息,但不用理它
                    byte[] bytes = new byte[255];
                    int by;//记录接收的字符数
                    string recvStr = string.Empty;
                    by = st.Receive(bytes, bytes.Length, 0);//从服务器端接受返回信息
                    recvStr += Encoding.ASCII.GetString(bytes, 0, by);

                    //发送用户名
                    recvStr = "";
                    byte[] msg = Encoding.UTF8.GetBytes("命令内容");
                    st.Send(msg, msg.Length, 0);

但是总是出现问题请大家帮我看看,我用st.Send是不是有问题
--------------------编程问答-------------------- up --------------------编程问答-------------------- 没有人帮帮我啊 --------------------编程问答-------------------- ??? --------------------编程问答-------------------- 直接用Process.Start("cmd");


2005年5月12日 如何调用命令行程序, 并得到输出, 还有输入交互? process早就有办法了, 只不过我没有注意. 

如调用一个命令行:"cmd /c dir c:\winnt"; 把结果放到一个字符串里. 



ProcessStartInfo psi = new ProcessStartInfo("cmd", " /c dir c:\winnt"); 
psi.RedirectStandardOutput = true; 
psi.UseShellExecute = false; 
Process p = Process.Start(psi); 
 
output = p.StandardOutput.ReadToEnd(); 
p.WaitForExit(); 
 注意那个waitforexit()一定要放到readtoend之后. MSDN里这样说: 

    process组件通过管道与子进程通信。如果子进程写入管道的数据多得足以填满缓冲区,则子进程将一直会阻塞到父进程从管道读取数据时为止。如果应用程序将所有输出读取到标准错误和标准输出,则这会导致死锁。 

    意思就是: 如果waitforexit在前, 那么如果数据太多而超出缓冲期大小, 子程序就会等着消费者把数据读出来, 可是这时候由于waitforexit正在阻塞, 做为消费者的过程序readtoend无法执行, 因而导致了死锁. 

   除了上面的, 还可以用程序交互: 


ProcessStartInfo psi = new ProcessStartInfo("cmd"); 
psi.RedirectStandardOutput = true; 
psi.RedirectStandardInput = true; 
psi.UseShellExecute = false; 
Process p = Process.Start(psi); 
 
p.StandardInput.WriteLine(@"dir c:\winnt"); 
p.StandardInput.WriteLine(@"ver"); 
p.StandardInput.WriteLine(@"exit"); 
 
output = p.StandardOutput.ReadToEnd(); 
p.WaitForExit(); 
 
    重定义了stdin, 执行cmd程序, 进入了命令行交互, 然后向标准输入里写若干个命令, 回车, 有意思, 执行了! 最后千万别忘记了用"exit"命令中断cmd的执行, 不然后面的readtoend时, 永远也不会读到END, 程序又阻塞在这里不会退出.  


    最后, MSDN提到了standarderror, 如果同时重定向了stdout和stderr, 那么不当的方式也会出现死锁: 如: 
string output = p.StandardOutput.ReadToEnd(); 
string error = p.StandardError.ReadToEnd(); 
p.WaitForExit(); 
 
    MSDN说程序先读了stdout, 完了之后再读stderr, 如果子进程在执行时向stderr写了内容, 那么就会死锁. 我想了一会儿, 没想明白. 如果程序在两个流里都写入了, 那么第一个读stdout的动作完成之前, stderror的内容留着不就行了? 但是没有时间试了. 
    MSDN建议用两个线程来处理不同重定向流.  这是个好办法. --------------------编程问答-------------------- UP~ --------------------编程问答-------------------- 4楼的方法我看不太懂~是不是回答有点文不对题 --------------------编程问答-------------------- up --------------------编程问答-------------------- 你要自己写TelNet?
--------------------编程问答-------------------- 我估计4楼是想用折中的方法吧,如果直接做telnet是比较麻烦的
直接调用telnet,并且用两个线程来处理流是好方法。
写telnet,要考虑下正常输出和异常输出的处理,还有就是windows自带的telnet是对等方式的 --------------------编程问答-------------------- 大家有没有办法啊
--------------------编程问答-------------------- 搂主的这种用法可能不对,Telnet协议是TCP/IP协议族中的一员,它为用户提供了在本地计算机上完成远程主机工作的能力,
要开始一个telnet会话,必须输入用户名和密码来登录服务器,Windows提供了Telent命令,搂主可以自己调用然后实现你
的功能。
参考资料:
http://baike.baidu.com/view/44255.htm
http://download.csdn.net/down/764333/nongxf1981 --------------------编程问答-------------------- 用 socket 写 telnet, 首先要读 RFC 文档.
网络程序必然引入线程, 难度大. --------------------编程问答-------------------- 用控件吧吧吧吧 --------------------编程问答-------------------- aaa --------------------编程问答-------------------- 顶~~~~~~~~~~~~~ --------------------编程问答-------------------- 学习中,我也想实现telnet功能!!! --------------------编程问答-------------------- --------------------编程问答-------------------- http://www.codeproject.com/KB/IP/MinimalisticTelnet.aspx --------------------编程问答-------------------- Mark.................
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,