VBでTELNETに接続したい


えだ  2008-10-03 16:59:04  No: 101176  IP: 192.*.*.*

はじめまして。
主題の通りVBでTELNETサーバーに接続したいとおもっています。
開発環境としては、手元にVB6があり、Expressのインストールも考えている状況です。

さて、やりたい事は単純で、DOS窓からTELNET作業する内容を自動化したいのです。
簡単に言えば、DOS窓から  
telnet targethostと入力し
username
password
その後
特定の命令(例えばls)を入力し、
出力結果を戻り値として受取り、終了。
という作業をしたいのです。
本当は対話式のプログラムなのでもう少しやりとりがあるのですが、
そこは自力で作ってみたいと思っています。

通信関係のVB命令を全然しらず、過去ログを含め、スケルトンを捜したのですがなかなか見つかりません。
やっと見つけたのがここの過去ログの
http://madia.world.coocan.jp/cgi-bin/VBBBS/wwwlng.cgi?print+200505/05050060.txt
なのですが、長すぎて理解を超えてしまっています。

単純なスケルトンはどこかにありませんでしょうか。
ちなみに、BASP21のような外部アプリ(?)を使用する事ができない条件です。
また、欲を言えば、DLLはWindows標準にインストールされているものだけが利用可能と言う事です。.NetFrameworkはインストール済という事になっています。この「欲を言えば」の部分は必須条件ではありません。

編集 削除
オショウ  2008-10-05 06:52:26  No: 101177  IP: 192.*.*.*

う〜ん・・・ソケット通信が基本的にできない?人にTELNETを
なんとかしろと言うのはかなり難しいかと。

私自身既にTELNETを.NETのソケット通信で実装していますので
そのソースコードを掲示板に貼り付けるのは簡単ですが・・・

検索した結果・・・
ttp://social.msdn.microsoft.com/Forums/en-US/netfxnetcom/thread/bf432ec4-cfdf-44be-a34a-5fdaf8115eb1/

ここでも同じように探している人が居て、紹介されているコー
ドとしては

ttp://bytes.com/forum/post2884304-7.html

まぁ〜このまま即流用できるかは、TELNETしたい先のサーバー
の仕様に準じますので・・・

頑張ってみて下さい。

以上。

編集 削除
ガッ  2008-10-05 07:34:51  No: 101178  IP: 192.*.*.*

telnetコマンドの標準入力にリダイレクトしてできる内容ならば,
あとはtelnetの標準出力を受け取れればいいのですよね?
vb6ならwsh経由でここ:http://d.hatena.ne.jp/potappo/20070630/1183213488とか
vb.netならここ:http://msdn.microsoft.com/ja-jp/library/cc364344.aspxとかが参考になると思います.

編集 削除
いな  2008-10-07 09:54:53  No: 101179  IP: 192.*.*.*

確か、以前部下が「かわい」の名前で投稿したサンプルが遭ったような

http://madia.world.coocan.jp/cgi-bin/VBBBS/wwwlng.cgi?print+200609/06090063.txt

編集 削除
えだ  2008-10-08 13:26:19  No: 101180  IP: 192.*.*.*

色々とありがとうございます。

いなさん(かわいさん)のものを参考に以下を作ってみましたが
どうしてもうまくいきません。
(メッセージボックスが表示されません)
間違いを指摘していただけると助かります。
ステップ実行ではCommand1_Click関数が最後まで処理されている事が確認できています。

【作業】
1、ローカルマシンのTELNETサービスを起動し、コマンドプロンプトから起動の確認をする
2、VB6を起動し、標準Exeプロジェクトを選択して開く
3、Microsoft Winsck conpornent 6.0を導入する
4、フォームにコマンドボタン1個を配置する
5、Sinsockコントロールをフォームに配置する
6、フォームモジュールに以下のコードを書く
7、F5キーにて開始する
8、コマンドボタンを押す

【コード】
Private Sub Command1_Click()
    With Winsock1
        If .State = sckClosed Then
            .RemoteHost = "localhost"        ' 接続ホスト名
            .RemotePort = "1001"        ' 接続ポート番号
            .Protocol = sckTCPProtocol      ' 接続プロトコル
            .Connect
        End If
    End With
End Sub

Private Sub Winsock1_Connect()
    
    MsgBox "接続しました" & vbCrLf & _
           Winsock1.RemoteHost & vbCrLf & _
           Winsock1.RemotePort
    End
End Sub

編集 削除
ガッ  2008-10-08 14:18:09  No: 101181  IP: 192.*.*.*

うーん,コマンドにリダイレクトするほうが簡単だと思ったんだけど…
以前telnetクライアントを作ったときは

1. 接続後に端末のネゴシエーションを行う(色々)
2. 端末と通信を行う(受信文バイト値の表示&送信文字列の送信)
  1. 認証が必要な場合は login: 等の文字列が受信されログイン名を送信し,Password: 等の文字列が受信されパスワードを送信する

という手順を行っていました.
ネゴシエーションはRFCにあるのでそちらを参考にしてください.
ネゴシエーション後は上記の通り単純な送受信処理ですので何とかなると思います.

編集 削除
えだ  2008-10-08 14:45:07  No: 101182  IP: 192.*.*.*

ネゴシエーションはWinsock1_Connect()で行うのかなと思っていましたが
間違っていますでしょうか。

リダイレクトを選ばなかった理由は
将来的に接続先と対話式に通信を行いたかった事と
通信先のTELNETがEXITコマンドを持っておらず、唐突に接続を切らなければならい事と、
その癖に対話の途中で接続切ってはいけない事など、クセがあるからです。
なので、Wshでバッチ式に行ってリダイレクトする方法だと、テストしずらいかな、と思ったからです。
さらには、将来展望の中にFTPも混ぜるなどがあり・・・

何もできない癖に夢の大きい私です。恥ずかしいです。

話を戻しますが、上記コードがうまくいかなかった理由は
>1. 接続後に端末のネゴシエーションを行う(色々)
が無いからなのでしょうか。

編集 削除
ガッ  2008-10-08 14:54:09  No: 101183  IP: 192.*.*.*

なるほど,そういう指向があるのなら仕方がないかもしれません.

> 話を戻しますが、上記コードがうまくいかなかった理由は
> >1. 接続後に端末のネゴシエーションを行う(色々)
> が無いからなのでしょうか。
いいえ,TCPの接続とTELNTの接続は別物です.
TCPで接続後にTELNETのネゴシエーション処理(接続処理のようなもの)を行わなければなりません.

編集 削除
えだ  2008-10-08 15:59:51  No: 101184  IP: 192.*.*.*

ちょっと自己解決

ポート番号を23にしたらダイアログが出るようになりました。

これからネゴシエーションの部分を作ってみます。
とりあえず、受信データの16進カンマ区切りの内容が何なのか調べる所から
スタートです。
引き続きご指導いただきたいので、解決マークはつけないでおきます。

編集 削除
えだ  2008-10-08 17:20:33  No: 101185  IP: 192.*.*.*

だいぶん進みました。
パスワード入力までできるようになりました。

現在、パスワードのエコーバックが変な文字コードですが、気にしていませんが、どうもログインに失敗している様子です。
現在のコードでは、成功しても失敗しても、進んでしまうので、
既定の文字列を待つようにする工夫が必要です。タイムアウトも入れたいので
そこをどうするか考え中です。

ご報告まで。

編集 削除