yochang 2006-12-6 15:42
求助:vb中使用winsock控件开发telnet客户端程序的问题,详见内
问题:大多数服务器端都可以正常连接,只有一类终端连接后没有任何回显,发送指令也没有反应,而这一类服务器端使用windows命令行的telnet、超级终端、SecureCRT等终端工具都可以正常连接,急盼高人回复。VB代码节选如下:
'送指令
Private Sub SendStringToDevice(LineText As String)
Dim Temp1 As String, L As Integer, i As Integer, K As Integer, A As String
L = Len(LineText)
For i = 1 To L
A = Mid(LineText, i, 1)
Call SendSigleKey(Asc(A))
Next i
End Sub
Private Sub SendSigleKey(KeyAscii As Integer)
On Error GoTo 1
If KeyAscii = 13 Then
'Text2.Text = ""
Winsock1.SendData Chr(13)
KeyAscii = 0
Else
Winsock1.SendData Chr(KeyAscii)
'DoEvents 注释不注释没有区别
End If
Exit Sub
1 KeyAscii = 0
End Sub
'获得和显示数据
Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
Dim strbuf As String
Winsock1.GetData strbuf, vbString
Text1.Text = Text1.Text & strbuf
End Sub
我已经试了自己能找到的任何方法,但服务器端只返回“????”,服务器是成熟的商用软件,且其他终端工具登录都没有问题。
急啊!
Nothing 2006-12-6 22:04
[url]http://www.lihuasoft.net/source/show.php?id=235[/url]
yochang 2006-12-7 12:34
谢谢回复!
可是这段代码以前就下载过,仍然有前述的问题。
Nothing 2006-12-7 18:42
下面代码的问题
[code]
Dim strbuf As String
Winsock1.GetData strbuf, vbString
Text1.Text = Text1.Text & strbuf
[/code]
关于出现???可能是字符编码的问题,还有可能是字体,一般中文字会出现???
你可以改一下Text1的字体,将它设置成宋体试试。
yochang 2006-12-7 19:26
谢谢!
现在text1的字体就是宋体,我又把它字符集改成了“西方”,还是不行。
我感觉是winsock的connect的问题,客户端无法正确连接服务器端,发出的连接指令服务器端没有正常反应。
想问一下:除了
Form1.Winsock1.Connect IPAdd, "23"
这种方式外,还有什么方法可用?
Nothing 2006-12-7 22:04
你的意思是说能收到????,但不能收到字正确的字符?
这样试试
[code]
Dim strbuf() As Byte
Winsock1.GetData strbuf, vbArray + vbByte
Text1.Text = Text1.Text & StrConv(strbuf, vbUnicode)
[/code]
yochang 2006-12-8 12:27
谢谢版主!
我改了,可还是不行,感觉是connect就没有正确连接服务器端。
如果只是回显不正常倒还好办一点
netice 2006-12-10 01:12
没有正确连接咋能收到。???晕也。。
Winsock1.SendData Chr(13)
上边啥意思?传递数组吗?
Nothing 2006-12-10 11:37
楼上的
[code]
Winsock1.SendData Chr(13) 是发送回车字符
[/code]
问题:大多数服务器端都可以正常连接,只有一类终端连接后没有任何回显,发送指令也没有反应
你说说这类服务器端是什么服务器?不会是加密的SSH服务吧?
yochang 2006-12-11 13:08
是标准的telnet server,不是ssh服务器。用dos命令行、超级终端等终端工具都可以telnet上服务器,服务器返回字符如下:
Pragma Systems Inc.
Welcome to Pragma TelnetServer 2000 for Windows NT
(C) Copyright 1994-2000 Pragma Systems, Inc.
login name:
Nothing 2006-12-11 15:26
如果你的程序在其他TELNET中是正常的,只在这个服务器中不正常,你可以用sniff工具查看一下其他工具的数据包,看看别的客户端传的是什么?
yochang 2006-12-15 16:11
用sniffer抓包试过了,成熟的终端程序和我自己开发的程序确有区别,在经过两次握手、交互后,在terminal-type的交互中出了问题,服务器端没有了下文。
具体的sniffer文件我可以通过邮件提供,我的邮箱:[email]13901587157@e172.com[/email]
另:一个同事用jsp编程,调用socket控件连接同样一个终端,也和我是完全一样的问题。
希望版主搭救!
Nothing 2006-12-15 19:59
你测试一下数据包和别的Server端的区别?如果有区别的话,一定是这个服务器端的问题。
你可以模拟和别的软件包一样的数据传给服务器,实现不行的话,换Telnet服务器吧。
yochang 2006-12-16 15:20
服务器端没有问题,理由是除了我们自己写的程序外,流行的telnet客户端都可以正常登录该服务器。
服务器也不可能换,是稳定运行了很久的设备,有许多其他的设备都要访问它的。
绝望了
Nothing 2006-12-16 18:57
你用sniff工具抓一下别的TELNET客户端发送的信息,然后你用程序发送同样的程序,看看可不可以通过。要完全一样,使用二进制发送。
yochang 2006-12-30 16:28
搞定了!是服务器端协商问题,服务器端发出协商信息,winsock没有回应。通过查找例程,现对所有的协商都回“wont”,然后服务器就乖乖的接受连接了。相关代码见内
'*****************************************************************************
' 为解决HLR41、42的问题,增加的代码
'*****************************************************************************
Function Inkey() As Byte
Dim b As Byte
'循环等待服务器端的数据
While Winsock1.BytesReceived = 0
Nop
Wend
'获得服务器端数据,每次获得一个字节
Winsock1.GetData b
'返回获得的字节
Inkey = b
End Function
'控操作过程,以等待服务器端的数据
Sub Nop()
DoEvents: DoEvents: DoEvents: DoEvents: DoEvents: DoEvents: DoEvents:
DoEvents: DoEvents
End Sub
Function VVV(D$)
'将字符串转换成数值
VVV = Val(D$)
'然后去除被转换成数值的字符串
D$ = Mid$(D$, InStr(D$ + ";", ";") + 1)
End Function
Sub SendChars(D$)
Dim b As Byte
While D$ <> ""
b = VVV(D$)
'然后发送该字节
Winsock1.SendData b
Wend
End Sub
Sub ttt()
Dim b As Byte, LL
Dim C, D, V, xx, yy As Byte
Dim X, Y, L, F, T As Integer
Dim s$, dat$, p&
While Winsock1.BytesReceived > 0
'DoEvents
b = Inkey
'分析得到的字节数据
Select Case b
Case 255
'255表示的是命令的先导字符,即后面的数据是命令
'接着获得后面两个字节的数据,分别放在变量c和d中
C = Inkey
D = Inkey
'如果c为253,表示发出do命令,服务器提出要求协商
If C = 253 Then 'And (D = 1 Or D = 24)
SendChars "255;251;" & D
GoTo L2
End If
'如果c为254,表示拒绝接收
If C = 254 And D = 1 Then
SendChars "255;252;1"
GoTo L2
End If
'如果为251 ,表示愿意激活某个选项
If C = 251 And D = 1 Then
SendChars "255;254;1"
GoTo L2
End If
'如果是250,表示的是子协商选项
If C = 250 Then
'循环等到d等于240,表示子协商结束
While D <> 240
D = Inkey
Wend
SendChars "255;250;24;0;118;116;49;48;48;255;240"
GoTo L2
End If
'如果是253,发出do命令
' If C = 253 Then
' SendChars "255;252;" & D
' GoTo L2
' End If
End Select
L2: Wend
'Connectdd = True
End Sub