討論區快速選單
知識庫快速選單
掌握Salesforce雲端管理秘訣 網路投保旅行平安險
[ 回上頁 ] [ 討論區發言規則 ]
VB6 Winsock 為何收到 ? ? ? ?
更改我的閱讀文章字型大小
作者 : davidchuang(david)
[ 貼文 20 | 人氣 4768 | 評價 60 | 評價/貼文 3 | 送出評價 2 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2007/7/3 下午 09:05:07
各位大大們請幫幫忙:

小弟我用了 vb6 Winsock 寫了一支類似 telnet 的程式, RemotePort = 23
-------------------------------------------------------------------------
Private Sub Login_Click()

Dim send As String
send = "root"
WinsockClient.SendData send & vbCrLf
GetText.Text = GetText.Text & send & vbCrLf

End Sub
-----------------------------------------------------------------------
Private Sub WinsockClient_DataArrival(ByVal bytesTotal As Long)

Dim received As String
WinsockClient.GetData received, vbString
GetText.Text = GetText.Text & received

End Sub
-------------------------------------------------------------------------

事由: 1. 連上 wifi ap 平台 , 一開始出現 ? ? ? 接著我輸入 root , server 端 會回應 username:root password: 雖然有 ? ? ? 但我還可以接受...起碼動作正常...
     2. 但是...我換了一台 linux pc 連上, 出現 ? ? ? ? 接著我輸入 root , ? ? ? ? root , 此時server 端 並沒有回應我 ...
     3. 我改用 Dos mode 下 telnet 192.168.1.1 所顯示的畫面是 Fedora Core release 1 <Yarrow>
     Kernel 2.4.21-timesys-4.1.147 on an i686
     login:
下 root 後 顯示 password:

問題 1. 為何會接受到 ? ? ? ?
問題 2. 為何 linux pc 無法回應我 ...


作者 : 793643(Max) 貼文超過200則
[ 貼文 274 | 人氣 2420 | 評價 600 | 評價/貼文 2.19 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2007/7/6 上午 04:27:49
給你幾個建議
1.Getdata部分,先改用vbbyte的方式去接收,很多Telnet傳送接收資料時,
   資料是vt100的格式,關於vt100的格式,你可以上網查一下輸入"vt100"
   會找到一卡車的資料
2.Telnet連接上之後,對方應該會回傳一個ECHO,這些是不可見字元
3.Senddata時,將一串文字拆開,一個字元一個字元傳送,會比較好
4.畫面會出現很多????應該是回傳的資料有很多不可見字元,所以系統以問號來表示

最後,我有一個完全用vb寫成的telnet程式,這個程式只用到winsock與貼圖的api
,其他的都在解析vt100,這是我當初要寫telnet程式時,在網路抓的sample,雖然
很不錯,不過,不懂vt100的格式的話,程式就有看沒有懂

有需要,請留下mail,我在寄給你

作者 : davidchuang(david)
[ 貼文 20 | 人氣 4768 | 評價 60 | 評價/貼文 3 | 送出評價 2 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2007/7/6 下午 02:52:52
感謝 Max 大大 ...

e-mail: davidchuang@ms95.url.com.tw

---------------------------------------
補充:
我在 linux pc 打開 Ethereal 抓封包 來看...
Dos mode 的 telnet :

     client (XP) server (linux pc)

1. --- SYN --->
2. <--SYN, ACK ---
3. --- ACK --->
4. <--- Data ---
    Do Terminal Type
    Do Terminal Speed
    Do X Display Location
    Do New Environment Option
5. --- Data --->
    Will Terminal Type
    Will Negotiate About Window Size
6. <--- ACK ---
7. <--- Data ---
    Do Negotiate About Windows Size
8. .............
9. .............
.
.
.

但我的程式在 第 5. 是回 ACK , 再來就送出 "root", 沒有 TELNET 協議命令控制建立協調機制 (IAC)
作者 : 793643(Max) 貼文超過200則
[ 貼文 274 | 人氣 2420 | 評價 600 | 評價/貼文 2.19 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2007/7/6 下午 04:28:01
Telnet Sample code我已經寄給你了,你在去研究一下唄
另外擬補充的部份,我不懂Linux,沒辦法回答你
你可以先try sample,看能不能正常跑
有問題,在提出吧
作者 : davidchuang(david)
[ 貼文 20 | 人氣 4768 | 評價 60 | 評價/貼文 3 | 送出評價 2 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2007/7/6 下午 08:03:24
Max 大大:

我已收到了 Tks ...

這 Telnet Sample code
正巧...是我參照他的寫法所寫出來的...

他本身也是相同的問題...

謝謝!
作者 : 793643(Max) 貼文超過200則
[ 貼文 274 | 人氣 2420 | 評價 600 | 評價/貼文 2.19 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2007/7/7 上午 12:55:39
要不,PO一下winsock所接收到的byte陣列資料上來一起看看資料內容是甚麼格式
畢竟,我沒用過Telnet連接Linux系統
作者 : davidchuang(david)
[ 貼文 20 | 人氣 4768 | 評價 60 | 評價/貼文 3 | 送出評價 2 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2007/7/9 下午 05:35:08
winsock所接收到的byte陣列資料是 255
-------------------------------
增加 IAC 協調機制

  Const WILLTEL = 251
  Const WONTTEL = 252
  Const DOTEL = 253
  Const IAC = 255
  Const ECHO = 1
  Const SGA = 3
  Const TERMTYPE = 24
  Const NAWS = 31
  Const TERMSPEED = 32
-----------------------------------------
  Private Sub WinsockClient_Connect()
 Dim ConnectString As String

  ConnectString = Chr$(IAC) & Chr$(DOTEL) & Chr$(ECHO) _
     & Chr$(IAC) & Chr$(DOTEL) & Chr$(SGA) _
     & Chr$(IAC) & Chr$(WILLTEL) & Chr$(NAWS) _
     & Chr$(IAC) & Chr$(WILLTEL) & Chr$(TERMTYPE) _
     & Chr$(IAC) & Chr$(WILLTEL) & Chr$(TERMSPEED)
  Winsock1.SendData ConnectString
  End Sub
----------------------------------------
  Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
     Dim received As String
     WinsockClient.GetData received, vbString
     GetText.Text = GetText.Text & received
    
  End Sub
----------------------------------------

又發生一個問題: 送進去的是 ff 00 01
     ff 00 03
     ff 00 1f
     ff 00 18
     ff 00 20
 ASCII 的範圍是 0 ~ 127 , 對 Chr$(DOTEL), Chr$(WILLTEL) 是錯誤的 00 ,
要如何...才能送進正確的值呢?
作者 : w100(Jones) Visual Basic曠世奇才貼文超過500則
[ 貼文 927 | 人氣 906 | 評價 5860 | 評價/貼文 6.32 | 送出評價 3 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
主題發起人davidchuang註記此篇回應為最佳解答 2007/7/9 下午 10:30:10
用Byte陣列傳傳看:
    Dim Buff(5) As Byte
    buff(0)=67
    buff(1)=87
    buff(2)=251
    buff(3)=189
    buff(4)=225
    buff(5)=90
    Winsock1.SendData Buff
作者 : 793643(Max) 貼文超過200則
[ 貼文 274 | 人氣 2420 | 評價 600 | 評價/貼文 2.19 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2007/7/10 上午 03:17:53
> Private Sub WinsockClient_Connect()
> Dim ConnectString As String
>
> ConnectString = Chr$(IAC) & Chr$(DOTEL) & Chr$(ECHO) _
> & Chr$(IAC) & Chr$(DOTEL) & Chr$(SGA) _
> & Chr$(IAC) & Chr$(WILLTEL) & Chr$(NAWS) _
> & Chr$(IAC) & Chr$(WILLTEL) & Chr$(TERMTYPE) _
> & Chr$(IAC) & Chr$(WILLTEL) & Chr$(TERMSPEED)
> Winsock1.SendData ConnectString
> End Sub

這一段應該是抄的吧,在我不改選項之下,我已經刪掉這段程式碼囉,因為一看就知道有問題
這些只是做選項設定用的,先把這段忽略掉,連上之後,先不更改設定
首先要做的是,你傳出去的Data與接收到的Data正確並能夠確實顯示在你的螢幕
之後上在回來考慮選項設定的問題
現在,螢幕會顯示問號的問題已經解決了嗎?還是你已經都全部OK了?
作者 : davidchuang(david)
[ 貼文 20 | 人氣 4768 | 評價 60 | 評價/貼文 3 | 送出評價 2 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2007/7/10 上午 11:48:45
Private Sub WinsockClient_DataArrival(ByVal bytesTotal As Long)

Dim ch() As Byte
Dim i As Integer
Dim str As String

If (bytesTotal > 0) Then
WinsockClient.GetData ch, vbByte + vbArray, bytesTotal
Else
Exit Sub
End If

For i=0 To bytesTotal - 1
str = str & Chr$(ch(i))
Next i
.
.
.
End Sub
-----------------------------
螢幕會顯示問號的問題是 Linux pc (server) 丟出來 IAC 的 Data 封包
解析如下:

ch(0)=255 ch(1)=253 ch(2)=24
ch(3)=255 ch(4)=253 ch(5)=32
ch(6)=255 ch(7)=253 ch(8)=35
ch(9)=255 ch(10)=253 ch(11)=39

255 253 24 (Do Terminal Type)
255 253 32 (Do Terminal Speed)
255 253 35(Do X Display Location)
255 253 39(Do New Environment Option)

所以我(Client)必須去回應它 ...
Dim TR(2) As Byte
TR(0) =255: TR(1) = 252: TR(2) = 32 'Won't Terminal Speed
WinsockClient.SendData TR

Server 雖然有回 ACK , 但沒有 再丟出 IAC 的 Data 封包出來 ...
所以無法再繼續跑下去...

作者 : sailormoontw(Sailormoontw)
[ 貼文 118 | 人氣 3595 | 評價 430 | 評價/貼文 3.64 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2007/7/10 下午 01:34:17
telnet 中我覺得它是一種交涉
它 server 問 client
你的 terminal type, 你的 speed, 你的視窗大小, 你的選項...
可能你還沒回給它, 所以它就沒繼續下去...
作者 : davidchuang(david)
[ 貼文 20 | 人氣 4768 | 評價 60 | 評價/貼文 3 | 送出評價 2 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2007/7/25 下午 09:54:45
終於ok 了 ...

我是模仿其他 telnet 程式...如何跟 server 溝通的.

通關密碼:
Server: ff fd 18 ff fd 20 ff fd 23 ff fd 27
Client: ff fb 18 ff fd 03 ff fb 03 ff fd 01 ff fb 1f
Client: ff fc 20 ff fc 23 ff fc 27
Server: ff fb 03 ff fd 03 ff fb 01 ff fd 1f ff fa 18 01
Client: ff fa 1f 00 50 00 18 ff f0
Client: ff fa 18 00 76 74 31 30 30 ff f0
Server: ff fd 01 ff fb 05 ff fd 21
Client: ff fc 01
Client: ff fe 05 ff fc 21
Server: login:

記得要轉成 10進位
作者 : rich1107(Rich)
[ 貼文 22 | 人氣 1258 | 評價 10 | 評價/貼文 0.45 | 送出評價 14 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2007/7/26 上午 10:30:30
請問 David 大哥 ~

我也遇到你相同的問題~希望能多賜教 ^^"

Telnet 與 Server 溝通這段程式要如何寫呢??
可以寄給我參考嗎??
感恩!! 謝謝喔~~

我的E-Mail:rich@pronets.com.tw

作者 : davidchuang(david)
[ 貼文 20 | 人氣 4768 | 評價 60 | 評價/貼文 3 | 送出評價 2 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2007/7/26 下午 02:33:46

Private Sub WinsockClient_DataArrival(ByVal bytesTotal As Long)

Dim ch() As Byte
Dim TR() As Byte
Dim i As Integer
Dim str As String

If (bytesTotal > 0) Then
WinsockClient.GetData ch, vbByte + vbArray, bytesTotal
Else
Exit Sub
End If

For i = 0 To bytesTotal - 1
str = str & Chr$(ch(i))
Next i


If ch(0) = 255 Then

  If ch(1) = 253 Then
 
     If ch(2) = 24 Then
     ReDim TR(14) As Byte
     TR(0) = 255: TR(1) = 251: TR(2) = 24
     TR(3) = 255: TR(4) = 253: TR(5) = 3
     TR(6) = 255: TR(7) = 251: TR(8) = 3
     TR(9) = 255: TR(10) = 253: TR(11) = 1
     TR(12) = 255: TR(13) = 251: TR(14) = 31
     WinsockClient.SendData TR
     End If
  
     If ch(2) = 1 Then
     ReDim TR(2) As Byte
     TR(0) = 255: TR(1) = 252: TR(2) = 1
     WinsockClient.SendData TR

     Pause (1)

     ReDim TR(5) As Byte
     TR(0) = 255: TR(1) = 254: TR(2) = 5
     TR(3) = 255: TR(4) = 252: TR(5) = 33
     WinsockClient.SendData TR
     End If
  End If

  If ch(1) = 251 Then
    If ch(2) = 3 Then
    ReDim TR(8) As Byte
    TR(0) = 255: TR(1) = 252: TR(2) = 32
    TR(3) = 255: TR(4) = 252: TR(5) = 35
    TR(6) = 255: TR(7) = 252: TR(8) = 39
    WinsockClient.SendData TR
    End If
  End If

  If ch(1) = 250 Then
    If ch(2) = 24 Then
    ReDim TR(8) As Byte
    TR(0) = 255: TR(1) = 250: TR(2) = 31
    TR(3) = 0: TR(4) = 80: TR(5) = 0
    TR(6) = 24: TR(7) = 255: TR(8) = 240
    WinsockClient.SendData TR
  
    Pause (1)

    ReDim TR(10) As Byte
    TR(0) = 255: TR(1) = 250: TR(2) = 24
    TR(3) = 0: TR(4) = 118: TR(5) = 116
    TR(6) = 49: TR(7) = 48: TR(8) = 48
    TR(9) = 255: TR(10) = 240
    WinsockClient.SendData TR
    End If
  End If
 
End If

End Sub
作者 : rich1107(Rich)
[ 貼文 22 | 人氣 1258 | 評價 10 | 評價/貼文 0.45 | 送出評價 14 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2007/7/26 下午 04:26:23
感謝 David 大哥的回覆~
小弟試試看~

非常感謝喔~~ ^^
作者 : rich1107(Rich)
[ 貼文 22 | 人氣 1258 | 評價 10 | 評價/貼文 0.45 | 送出評價 14 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2007/7/26 下午 07:28:46
請問~
我為何都看不到GetData與SendData的資料呢??
我快瘋了~請幫幫忙~~非常感謝~~

我的程式如下

Private Sub TelnetClient()
    
    Dim test() As Byte
    Dim bytesTotal As Long
    
    Dim CH() As Byte
    Dim TR() As Byte
    
    If TelnetWinsock.State <> 0 Then TelnetWinsock.Close
    TelnetWinsock.RemoteHost = "192.168.99.1"
    TelnetWinsock.RemotePort = 23
    TelnetWinsock.LocalPort = 0
    TelnetWinsock.Connect
  
    If TelnetWinsock.State <> 7 Then
     Do
     DoEvents
     Loop Until TelnetWinsock.State = 7
    End If
   
    
    ReDim CH(2) As Byte
    TelnetWinsock.GetData CH, vbByte + vbArray, bytesTotal
    If CH(0) = 255 Then
     If CH(1) = 251 Then
     If CH(2) = 1 Then
    
     ReDim TR(2) As Byte
     TR(0) = 255: TR(1) = 253: TR(2) = 1 '(Do Echo)
     TelnetWinsock.SendData TR
     Delay (1)
    
     End If
     End If
    End If
    ** 以上會過不去,請問是什麼原因?? **
    
    ReDim TR(20) As Byte
    TR(0) = 255: TR(1) = 251: TR(2) = 3 '(Will Suppress Go Ahead)
    TR(3) = 255: TR(4) = 253: TR(5) = 3 '(Do Suppress Go Ahead)
    TR(6) = 255: TR(7) = 251: TR(8) = 31 '(Will Negotiate About Windows Size)
    TR(9) = 255: TR(10) = 250: TR(11) = 31 '(Suboption Begin: Negotiate About Windows Size)
    TR(12) = 0: TR(13) = 80: TR(14) = 0 '(Width:80 Heigh:25)
    TR(15) = 25: TR(16) = 255: TR(17) = 240 '(Suboption End)
    TR(18) = 255: TR(19) = 251: TR(20) = 24 '(Will Terminal Type)
    TelnetWinsock.SendData TR
    Delay (1)
    

    ReDim TR(11) As Byte
    TR(0) = 255: TR(1) = 251: TR(2) = 31 '(Will Negotiate About Windows Size)
    TR(3) = 255: TR(4) = 250: TR(5) = 31 '(Suboption Begin: Negotiate About Windows Size)
    TR(6) = 0: TR(7) = 80: TR(8) = 0 '(Width:80 Heigh:25)
    TR(9) = 25: TR(10) = 255: TR(11) = 240 '(Suboption End)
    TelnetWinsock.SendData TR
    Delay (1)
    
    
    ReDim TR(2) As Byte
    TR(0) = 255: TR(1) = 251: TR(2) = 3 '(Will Suppress Go Ahead)
    TelnetWinsock.SendData TR
    Delay (1)
    
    
    ReDim TR(11) As Byte
    TR(0) = 255: TR(1) = 251: TR(2) = 31 '(Will Negotiate About Windows Size)
    TR(3) = 255: TR(4) = 250: TR(5) = 31 '(Suboption Begin: Negotiate About Windows Size)
    TR(6) = 0: TR(7) = 80: TR(8) = 0 '(Width:80 Heigh:25)
    TR(9) = 25: TR(10) = 255: TR(11) = 240 '(Suboption End)
    TelnetWinsock.SendData TR
    Delay (1)
    
    
    ReDim TR(11) As Byte
    TR(0) = 255: TR(1) = 250: TR(2) = 24 '(Suboption Begin: Terminal Type)
    TR(3) = 0: TR(4) = 65: TR(5) = 78 '(Value: ANSI)
    TR(6) = 83: TR(7) = 73: TR(8) = 255 '(Value: ANSI)
    TR(9) = 240: TR(10) = 0: TR(11) = 0 '(Suboption End)
    TelnetWinsock.SendData TR
    Delay (1)

    
    '/** Login Username and Password **/
    TelnetWinsock.SendData "admin" + Chr$(13)
    Delay (1)
    
    TelnetWinsock.SendData "admin" + Chr$(13)
    Delay (1)
    
    TelnetWinsock.GetData test, vbByte + vbArray, bytesTotal
    Dim F_Handle As Integer
    F_Handle = FreeFile()
    Open App.Path + "\test.txt" For Output As #F_Handle
    Print #F_Handle, test
    Close #F_Handle
    Delay (1)
    
End Sub
作者 : 793643(Max) 貼文超過200則
[ 貼文 274 | 人氣 2420 | 評價 600 | 評價/貼文 2.19 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2007/7/27 上午 08:50:44
1. 你的副程式要放在Winsock的DataArrival事件下,才可以正確的接收資料,因為
     bytesTotal是DataArrival回傳的參數
    WinsockClient_DataArrival(ByVal bytesTotal As Long)

2. 可以試試david提供的通關密碼跟副程式,整段copy過去就行了
作者 : 793643(Max) 貼文超過200則
[ 貼文 274 | 人氣 2420 | 評價 600 | 評價/貼文 2.19 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2007/7/27 上午 08:52:07

>終於ok 了 ...
>
>我是模仿其他 telnet 程式...如何跟 server 溝通的.
>
>通關密碼:
>Server: ff fd 18 ff fd 20 ff fd 23 ff fd 27
>Client: ff fb 18 ff fd 03 ff fb 03 ff fd 01 ff fb 1f
>Client: ff fc 20 ff fc 23 ff fc 27
>Server: ff fb 03 ff fd 03 ff fb 01 ff fd 1f ff fa 18 01
>Client: ff fa 1f 00 50 00 18 ff f0
>Client: ff fa 18 00 76 74 31 30 30 ff f0
>Server: ff fd 01 ff fb 05 ff fd 21
>Client: ff fc 01
>Client: ff fe 05 ff fc 21
>Server: login:
>
>記得要轉成 10進位

恭喜你終於破關了
作者 : davidchuang(david)
[ 貼文 20 | 人氣 4768 | 評價 60 | 評價/貼文 3 | 送出評價 2 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2007/7/27 上午 10:22:00
Max 大大:
謝謝您...的幫忙

Rich 大大:
加油!

Private Sub Login_Click()
  
     WinsockClient.SendData "root" & vbCrLf 'username

     Pause (1)

     WinsockClient.SendData "root" & vbCrLf 'password
    
End Sub

送佛送上西天
作者 : rich1107(Rich)
[ 貼文 22 | 人氣 1258 | 評價 10 | 評價/貼文 0.45 | 送出評價 14 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2007/8/2 下午 03:21:13
謝謝 David 與 Max 兩位大哥的指導~

但我還是有些疑問??
就是我把David哥的code copy過去了~然後將滑鼠移到GetData的ch與SendData的TR為何看不到東西呢??

還是他本來就看不到呢??

請兩位大哥~幫我一下~謝謝!!
作者 : 793643(Max) 貼文超過200則
[ 貼文 274 | 人氣 2420 | 評價 600 | 評價/貼文 2.19 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2007/8/2 下午 07:36:40
>將滑鼠移到GetData的ch與SendData的TR為何看不到東西呢??
因為那個被定義成陣列,你只用滑鼠移到參數上面,當然會看不到,你在加一個動作
滑鼠移到ch或TR上面之後,點滑鼠右鍵,裡面有一個add watch,這是監看參數的功能
這樣你就看的到了
作者 : rich1107(Rich)
[ 貼文 22 | 人氣 1258 | 評價 10 | 評價/貼文 0.45 | 送出評價 14 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2007/8/3 上午 11:10:48
非常感謝 Max 與 David 兩位大哥的大力幫忙~~ ^^
小弟我終於完成通關密語了~好高興喔~
但有點跟 David 哥的程式不太一樣,我做了修改如下~~

但我還有一個問題,就是如何GetData的資料轉成string呢??
因為我要show在TextBox~~ 再次謝謝幫忙 ^^

Private Sub TelnetWinsock_DataArrival(ByVal bytesTotal As Long)

Dim ch() As Byte
Dim TR() As Byte
Dim i As Integer
Dim str As String

If (bytesTotal > 0) Then
TelnetWinsock.GetData ch, vbArray + vbByte, bytesTotal
Else
Exit Sub
End If

For i = 0 To bytesTotal - 1
str = str & Chr$(ch(i))
Next i

If ch(0) = 255 Then
  
  If ch(1) = 251 Then
     If ch(2) = 1 Then
    
     ReDim TR(2) As Byte
     TR(0) = 255: TR(1) = 253: TR(2) = 1
     TelnetWinsock.SendData TR

     End If
  End If

  If ch(1) = 253 Then
     If ch(2) = 31 Then
    
     ReDim TR(20) As Byte
     TR(0) = 255: TR(1) = 251: TR(2) = 3
     TR(3) = 255: TR(4) = 253: TR(5) = 3
     TR(6) = 255: TR(7) = 251: TR(8) = 31
     TR(9) = 255: TR(10) = 250: TR(11) = 31
     TR(12) = 0: TR(13) = 80: TR(14) = 0
     TR(15) = 25: TR(16) = 255: TR(17) = 240
     TR(18) = 255: TR(19) = 251: TR(20) = 24
     TelnetWinsock.SendData TR

     End If
  End If
  
  If ch(1) = 251 Then
     If ch(2) = 3 Then
    
     ReDim TR(2) As Byte
     TR(0) = 255: TR(1) = 251: TR(2) = 3
     TelnetWinsock.SendData TR

     End If
  End If
  
  If ch(1) = 253 Then
     If ch(2) = 3 Then
    
     ReDim TR(11) As Byte
     TR(0) = 255: TR(1) = 251: TR(2) = 31
     TR(3) = 255: TR(4) = 250: TR(5) = 31
     TR(6) = 0: TR(7) = 80: TR(8) = 0
     TR(9) = 25: TR(10) = 255: TR(11) = 240
     TelnetWinsock.SendData TR

     End If
  End If
  
  If ch(1) = 240 Then
     If ch(2) = 24 Then
    
     ReDim TR(11) As Byte
     TR(0) = 255: TR(1) = 250: TR(2) = 24
     TR(3) = 0: TR(4) = 65: TR(5) = 78
     TR(6) = 83: TR(7) = 73: TR(8) = 255
     TR(9) = 240: TR(10) = 0: TR(11) = 0
     TelnetWinsock.SendData TR

     End If
  End If
  
End If

End Sub
作者 : davidchuang(david)
[ 貼文 20 | 人氣 4768 | 評價 60 | 評價/貼文 3 | 送出評價 2 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2007/8/3 下午 12:08:03
不管黑貓還是白貓...
能捉老鼠的...就是好貓..

----------------------------------------
Private Sub WinsockClient_DataArrival(ByVal bytesTotal As Long)
----------------------------------------
.
.
.
.
func.send_to_buffer_getdata (str)
End Sub



----------------------------------
func.bas
----------------------------------
Public Function send_to_buffer_getdata(text_to_show As String)

If (Len(Form1.ScreenText.Text) = 0) Then
Form1.ScreenText.Text = text_to_show & vbCrLf
Else
Form1.ScreenText.Text = Form1.ScreenText.Text & text_to_show
End If

End Function
作者 : rich1107(Rich)
[ 貼文 22 | 人氣 1258 | 評價 10 | 評價/貼文 0.45 | 送出評價 14 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2007/8/3 下午 01:50:36
謝謝 David 哥如此快的回覆~~
小弟馬上去試試~~ ^^
作者 : rich1107(Rich)
[ 貼文 22 | 人氣 1258 | 評價 10 | 評價/貼文 0.45 | 送出評價 14 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2007/8/3 下午 02:34:16
請問 David 哥 ~
那show在ListBox要如何改呢??
感恩~謝謝~
作者 : rich1107(Rich)
[ 貼文 22 | 人氣 1258 | 評價 10 | 評價/貼文 0.45 | 送出評價 14 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2007/8/3 下午 04:26:32
再次請問David哥~~

我用TextBox的方式~可以show出來~~
但有些字卻show不出來~
我用Windows login進去,確實可以show在螢幕上
我用ethereal去看的確是可以看的到~如下

Telnet
    Data: \000\r\n
    Data: \000The Image Version = xxxx
    Data: \000Control Code Version = xxxx
    Data: \000DSP Code Version = xxxx
    Data: \000BBS Code Version = xxxx
    Data: \000\r\n
    Data: \000

請問我要如何讓他show在TextBox上呢??

真的非常感謝各位大大的幫忙~~小弟愚昧還請指教~謝謝
作者 : rich1107(Rich)
[ 貼文 22 | 人氣 1258 | 評價 10 | 評價/貼文 0.45 | 送出評價 14 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2007/8/3 下午 06:33:18
各位大大~

我發現他會收到"\0"這各結束字元~
那我要如何接收全部的字元,然後再把"\0"這各給刪除呢???

我想這樣應該就可以都收到了吧~

請大家幫幫小弟吧~感恩
作者 : 793643(Max) 貼文超過200則
[ 貼文 274 | 人氣 2420 | 評價 600 | 評價/貼文 2.19 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2007/8/3 下午 07:09:41
你提的問題,我看的不是很懂,是接收到資料轉成字串後有"\0"字元的出現?
還是"\0"防礙到你要顯示的文字?
就VB來說"\0"字元並沒有代表特別的意義,就是純粹的字串而已
所以在顯示上,應該不會有問題
如果是轉出來的字串有包含"\0"字元,想要從字串裡面刪除,可以用replace函式
例 :
a="12345"
a=replace(a,"3","")
結果a會等於1245
不知道這是不是你想要的
作者 : rich1107(Rich)
[ 貼文 22 | 人氣 1258 | 評價 10 | 評價/貼文 0.45 | 送出評價 14 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2007/8/6 上午 10:51:34
感謝Max大哥的回覆~~

我在說明一下~
我發現我在接收資料時,沒有接收到全部的資料,因為沒有全部顯示出來~

不知是不是有限制接收資料的長度,還是因為接收到 "\0" 這各結束字元,導致後面的資料不去接收~

因為我有請朋友用BCB的Indy元件,來試試Telnet接收資料,發現他有限制接收資料的長度,然後我們把接收資料長度增加,但接收到 "\0" 後,以後的資料他就不在接收,因為程式認為已傳送完畢所以不在接收,然後我們把接收到的 "\0" 這各刪除,他就可以顯示全部的資料了~

我不知道VB Winsock的元件是不是一樣有這樣的問題,還請大大們幫我解答一下~~
再次感謝 ~~


作者 : rich1107(Rich)
[ 貼文 22 | 人氣 1258 | 評價 10 | 評價/貼文 0.45 | 送出評價 14 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2007/8/6 上午 11:43:32
各位大大~

程上敘訴~
請問,我再用Winsock做Telnet接收資料時,我要如何看到接收所有的資料呢??

請幫幫小弟謝謝!!
作者 : davidchuang(david)
[ 貼文 20 | 人氣 4768 | 評價 60 | 評價/貼文 3 | 送出評價 2 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2007/8/6 下午 12:09:01
其實...你的問題我不太清楚, 也沒碰過
可以試試下面這個看看...

Private Sub ScreenText_Change()

ScreenText.SelStart = Len(ScreenText.Text)

End Sub
作者 : rich1107(Rich)
[ 貼文 22 | 人氣 1258 | 評價 10 | 評價/貼文 0.45 | 送出評價 14 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2007/8/6 下午 04:03:15
在此感謝 Max 與 David 兩位大哥的大力協助!!

我的問題終於解完了~~太感動了 ^^

我的問題是字串接收到"\0"後,之後的資料都不在接收,小弟將程式改成如下就可以了

For i = 0 To bytesTotal - 1
     If ch(i)=0 then
     ch(i)=Replace(ch(i),"0","10")
     End If
     str = str & Chr$(ch(i))
Next i

這樣就可以將"\0"改掉了,我用ch(i)=Replace(ch(i),"0","")會有問題,所以將它改為換行,這樣我就可以接收全部的資料了~~

再次謝謝各位大大的幫忙 ^^
作者 : bosen0518(Bosen)
[ 貼文 3 | 人氣 92 | 評價 0 | 評價/貼文 0 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2008/2/28 下午 02:13:18
我最近也在寫Telnet程式,也遇到你們相同問題,可否也寄給我一份sample呢?
Bosenhuang@gmail.com
作者 : johnnick(Mitnick)
[ 貼文 8 | 人氣 802 | 評價 0 | 評價/貼文 0 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2011/10/16 下午 04:53:34
也可以寄給我一份嗎,小弟我最近也在寫這方面的程式,可否給予參考...
我的email:mitnick2004@hotmail.com 感恩
作者 : losegames(愛情絕緣体)
[ 貼文 85 | 人氣 7260 | 評價 10 | 評價/貼文 0.12 | 送出評價 6 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2011/10/18 下午 03:49:43
可以也寄給我ㄧ份嗎?

losegames@gmail.com

感恩大大~~
作者 : davidchuang(david)
[ 貼文 20 | 人氣 4768 | 評價 60 | 評價/貼文 3 | 送出評價 2 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2012/1/4 下午 04:37:22
日前收到網友來信詢問vb telnet登入問題, 為讓以後網友能清楚了解, 特公布程式source code...
Winsock1 --> RemotePort 設 23

-------------------------------------------------------------------------------------
Sub Pause(ByVal nSecond As Single)
 Dim t0 As Single
   t0 = Timer
   Do While Timer - t0 < nSecond
     Dim iEvents As Integer
     iEvents = DoEvents()
     ' if we cross midnight, back up one day
     If Timer < t0 Then
     t0 = t0 - CLng(24) * CLng(60) * CLng(60)
     End If
   Loop
End Sub

Private Sub Text2_Change()
Text2.SelStart = Len(Text2.Text)
End Sub

Private Sub Connect_Click()
Winsock1.Close
Winsock1.LocalPort = 0
Winsock1.RemoteHost = CStr(IpAddress.Text)
Winsock1.Connect
Module1.send_to_buffer ("登入中... " & Winsock1.RemoteHost)
End Sub

Private Sub Disconnect_Click()
If (Winsock1.State <> 0) Then
Winsock1.Close
Module1.send_to_buffer ("登出... " & Winsock1.RemoteHost)
End If
End Sub

Private Sub Login_Click()
Dim string_to_send As String
Winsock1.SendData "admin" & vbCrLf 'username 寫入
Module1.send_to_buffer_norm (string_to_send)
Pause (1)
string_to_send = "admin" 'password 寫入
Winsock1.SendData string_to_send & vbCrLf
Module1.send_to_buffer_norm (string_to_send)
End Sub

Private Sub Winsock1_Connect()
Dim ConnectString As String
Module1.send_to_buffer ("登入成功... " & Winsock1.RemoteHost)
End Sub
作者 : davidchuang(david)
[ 貼文 20 | 人氣 4768 | 評價 60 | 評價/貼文 3 | 送出評價 2 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2012/1/4 下午 04:40:32
接上續

Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
'接收資料
Dim ch() As Byte
Dim TR() As Byte
Dim i As Integer
Dim str As String

'-------------------------------------------------------------

If (bytesTotal > 0) Then ' If there is any data...
Winsock1.GetData ch, vbByte + vbArray, bytesTotal
Else
Exit Sub
End If

For i = 0 To bytesTotal - 1
str = str & Chr$(ch(i))
Next i


If ch(0) = 255 Then

  If ch(1) = 253 Then
 
     If ch(2) = 24 Then
     ReDim TR(14) As Byte
     TR(0) = 255: TR(1) = 251: TR(2) = 24
     TR(3) = 255: TR(4) = 253: TR(5) = 3
     TR(6) = 255: TR(7) = 251: TR(8) = 3
     TR(9) = 255: TR(10) = 253: TR(11) = 1
     TR(12) = 255: TR(13) = 251: TR(14) = 31
     Winsock1.SendData TR
     End If
  
     If ch(2) = 1 Then
     ReDim TR(2) As Byte
     TR(0) = 255: TR(1) = 252: TR(2) = 1
     Winsock1.SendData TR

     Pause (1)

     ReDim TR(5) As Byte
     TR(0) = 255: TR(1) = 254: TR(2) = 5
     TR(3) = 255: TR(4) = 252: TR(5) = 33
     Winsock1.SendData TR
     End If
  End If

  If ch(1) = 251 Then
    If ch(2) = 3 Then
    ReDim TR(8) As Byte
    TR(0) = 255: TR(1) = 252: TR(2) = 32
    TR(3) = 255: TR(4) = 252: TR(5) = 35
    TR(6) = 255: TR(7) = 252: TR(8) = 39
    Winsock1.SendData TR
    End If
  End If

  If ch(1) = 250 Then
    If ch(2) = 24 Then
    ReDim TR(8) As Byte
    TR(0) = 255: TR(1) = 250: TR(2) = 31
    TR(3) = 0: TR(4) = 80: TR(5) = 0
    TR(6) = 24: TR(7) = 255: TR(8) = 240
    Winsock1.SendData TR
  
    Pause (1)

    ReDim TR(10) As Byte
    TR(0) = 255: TR(1) = 250: TR(2) = 24
    TR(3) = 0: TR(4) = 118: TR(5) = 116
    TR(6) = 49: TR(7) = 48: TR(8) = 48
    TR(9) = 255: TR(10) = 240
    Winsock1.SendData TR
    End If
  End If
 
End If

Module1.send_to_buffer_getdata (str)
 
End Sub
作者 : davidchuang(david)
[ 貼文 20 | 人氣 4768 | 評價 60 | 評價/貼文 3 | 送出評價 2 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2012/1/4 下午 04:46:20
接上續

Add 一個 Module

Module1.bas
------------------------------------------------------------------------------------------------------------
Public Function send_to_buffer(text_to_display As String)
If (Len(Form1.Text2.Text) = 0) Then
Form1.Text2.Text = "*** " & text_to_display & vbCrLf
Else
Form1.Text2.Text = Form1.Text2.Text & vbCrLf & "*** " & text_to_display & vbCrLf & vbCrLf
End If
End Function

Public Function send_to_buffer_norm(text_to_input As String)
If (Len(Form1.Text2.Text) = 0) Then
Form1.Text2.Text = ">> " & text_to_input
Else
Form1.Text2.Text = Form1.Text2.Text & ">>> " & text_to_input & vbCrLf
End If
End Function

Public Function send_to_buffer_getdata(text_to_show As String)
If (Len(Form1.Text2.Text) = 0) Then
Form1.Text2.Text = text_to_show & vbCrLf
Else
Form1.Text2.Text = Form1.Text2.Text & text_to_show
End If
End Function

----------------------------------------------------------------------------------------
以上就完成了
作者 : ose2100(ogre)
[ 貼文 2 | 人氣 0 | 評價 0 | 評價/貼文 0 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2014/1/16 上午 10:31:16
我自己也想寫一個telnet 連線模組 請問可否也寄給我 VT100解析程序 ose2100@gmail.com

另 recv回來的資料可試試這個方法

Dim tempBuf() as byte
Dim strTemp as string


strTemp =  StrConv(tempBuf, vbUnicode)
這樣就能把recv來的byte 轉成字串來看


tempBuf = StrConv(strTemp , vbFromUnicode)
把字串轉成byte然後就可以send 出去了
作者 : ose2100(ogre)
[ 貼文 2 | 人氣 0 | 評價 0 | 評價/貼文 0 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2014/1/16 上午 10:31:29
我自己也想寫一個telnet 連線模組 請問可否也寄給我 VT100解析程序 ose2100@gmail.com

另 recv回來的資料可試試這個方法

Dim tempBuf() as byte
Dim strTemp as string


strTemp =  StrConv(tempBuf, vbUnicode)
這樣就能把recv來的byte 轉成字串來看


tempBuf = StrConv(strTemp , vbFromUnicode)
把字串轉成byte然後就可以send 出去了
 板主 : 小樓
 > Visual Basic 6.0/VBA - 討論區
 - 最近熱門問答精華集
 - 全部歷史問答精華集
 - Visual Basic 6.0/VBA - 知識庫
  ■ 全站最新Post列表
  ■ 我的文章收藏
  ■ 我最愛的作者
  ■ 全站文章收藏排行榜
  ■ 全站最愛作者排行榜
  ■  月熱門主題
  ■  季熱門主題
  ■  熱門主題Top 20
  ■  本區Post排行榜
  ■  本區評價排行榜
  ■  全站專家名人榜
  ■  全站Post排行榜
  ■  全站評價排行榜
  ■  全站人氣排行榜
 請輸入關鍵字 
  開始搜尋
 
Top 10
評價排行
Visual Basic 6.0/VBA
1 阿戊 10670 
2 小樓 8650 
3 Jones 5270 
4 水瓶天賞 2340 
5 joe 2230 
6 史努比 1950 
7 阿呆紅 1440 
8 tt's 1250 
9 青衫 1150 
10 羅啟章 1020 
Visual Basic 6.0/VBA
  專家等級 評價  
  一代宗師 10000  
  曠世奇才 5000  
  頂尖高手 3000  
  卓越專家 1500  
  優秀好手 750  
Microsoft Internet Explorer 6.0. Screen 1024x768 pixel. High Color (16 bit).
2000-2019 程式設計俱樂部 http://www.programmer-club.com.tw/
0.2810059