发新话题
打印

[网络] 求助:vb中使用winsock控件开发telnet客户端程序的问题,详见内

求助: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


我已经试了自己能找到的任何方法,但服务器端只返回“????”,服务器是成熟的商用软件,且其他终端工具登录都没有问题。
急啊!

TOP

谢谢回复!
可是这段代码以前就下载过,仍然有前述的问题。

TOP

谢谢!
现在text1的字体就是宋体,我又把它字符集改成了“西方”,还是不行。
我感觉是winsock的connect的问题,客户端无法正确连接服务器端,发出的连接指令服务器端没有正常反应。
想问一下:除了
Form1.Winsock1.Connect IPAdd, "23"
这种方式外,还有什么方法可用?

TOP

谢谢版主!
我改了,可还是不行,感觉是connect就没有正确连接服务器端。
如果只是回显不正常倒还好办一点

TOP

是标准的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:

TOP

用sniffer抓包试过了,成熟的终端程序和我自己开发的程序确有区别,在经过两次握手、交互后,在terminal-type的交互中出了问题,服务器端没有了下文。
具体的sniffer文件我可以通过邮件提供,我的邮箱:13901587157@e172.com
另:一个同事用jsp编程,调用socket控件连接同样一个终端,也和我是完全一样的问题。

希望版主搭救!

TOP

服务器端没有问题,理由是除了我们自己写的程序外,流行的telnet客户端都可以正常登录该服务器。
服务器也不可能换,是稳定运行了很久的设备,有许多其他的设备都要访问它的。

绝望了

TOP

搞定了!是服务器端协商问题,服务器端发出协商信息,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

TOP

发新话题