17 12
发新话题
打印

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

如果你的程序在其他TELNET中是正常的,只在这个服务器中不正常,你可以用sniff工具查看一下其他工具的数据包,看看别的客户端传的是什么?
换个头像,看见广告就眼红,直接封ID。

TOP

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

希望版主搭救!

TOP

你测试一下数据包和别的Server端的区别?如果有区别的话,一定是这个服务器端的问题。
你可以模拟和别的软件包一样的数据传给服务器,实现不行的话,换Telnet服务器吧。
换个头像,看见广告就眼红,直接封ID。

TOP

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

绝望了

TOP

你用sniff工具抓一下别的TELNET客户端发送的信息,然后你用程序发送同样的程序,看看可不可以通过。要完全一样,使用二进制发送。
换个头像,看见广告就眼红,直接封ID。

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

哈哈,原来是这样
换个头像,看见广告就眼红,直接封ID。

TOP

 17 12
发新话题