我得socket程序有问题,读取telnet 23端口返回乱码!why??? (50分)

  • 主题发起人 主题发起人 dao100
  • 开始时间 开始时间
D

dao100

Unregistered / Unconfirmed
GUEST, unregistred user!
我得socket程序有问题,why???

我得程序很简单,就是和服务器建立一个socket连接,然后在ClientSocketRead过程事件中用Socket.ReceiveText读取服务器的信息显示过来。
当我连接服务器的110 POP端口时,程序能够正确读取服务器的信息过来,如下:
+OK AIMC POP service (aimc.asiainfo.com) is ready.
但我连接telnet的23端口时,服务器的显示信息是:

SunOS 5.7

login:
而我的程序读过来显示的信息是
 
因为在出现
SunOS 5.7

login:
服务器和你的客户端要互相确认大家都接受的协议。
看看ICS控件组中的例子。
 
小弟是个新新手,可以说啥都知之不深,恳请详细指点! 多谢
 
我认为是因为你的程序没有进行Telnet协议的子协商过程,服务器才发出一堆问号:

基于TELNET协议的DELPHI程序与LINUX主机通信的实现
pitts (痛并快乐着)
......
(2)协商通信
一旦连接成功,主机将发回请求信息,从而进入Telnet协议的子协商过程。子协商过程,
是客户与服务器之间以协议约定好的命令结构形式的数据流进行相互通信的过程。这种子协商
过程的命令结构如图所示:
这些命令符都是八比特的ASCII字符,命令之间没有任何间隔符,这些ASCII字符可以用
ord()和chr()函数来进行字符与数字之间的转换。
建立接收缓冲区,调用recv()或recvfrom()函数等待服务器发送的信息。通常,服务器
将发送如下子协商命令:
IAC DO TERMINAL-TYPE (终端类型)
IAC DO TERAMINAL-SPEED(终端速率)
IAC DO X-DISPLAY-LOCATION(显示方式)
IAC DO ENVIRONMENT(环境)
建立发送缓冲区,根据上述信息进行回应,调用char()函数,将命令代码转换为ASCII字符
填入发送缓冲区,注意在“选项”中出现的非命令字符的字符串(如表示终端类型的字符串)
要以NVT ASCII String形式出现。调用send()或sendto()函数发送至服务器,并等待服务器的
回应信息,此后按照Telnet协议进一步进行子协商。例如,可以这样进行回应:
IAC DO TERMINAL-TYPE(协商终端类型)
IAC DONT TERMINAL-SPEED(不协商终端速率)
IAC DONT X-DISPLAY-LOCATION(不协商显示方式)
IAC DONT ENVIRONMENT(不协商环境)
一旦子协商命令执行完毕,服务器将发送服务器本身的版本信息和登录信息
 
接受答案了.
 
后退
顶部