はじめまして、windです。
今、VBのWinsockコンポーネントでTelnet接続を行おうとして困っています。
環境は
クライアント サーバ
WindowsXP SunOS5.8(Solaris)
VS6.0
です。
過去ログを拝見し、「login:」までは行くようになったんですが、
ログイン名を入れても次の「Password:」が出てきません。
loginを行う前に「IAC WILL TRANSMIT-BINARY(&HFF &HFB &H0)」を
送信しているのですが、これだけでは不足なのでしょうか?
全然検討がつかないでいます。
よろしくお願いします。
IAC WILLとかのときはバイトコードとして送信。
login:など、IDなどの文字は、テキストコードとして送信。
で、うまくいくと思います。
login:
を受け取って、IDを送った後、
変えてってきたデータが送ったデータの最初の一文字だったりしませんか?
(ex)
login:が来て
Loreley(とCRLF)を送信した(つもり)が、
Lだけ返ってきた。
そのときは送信に失敗しています。
追記ですが、
ユーザーが存在しない場合も
ほっておかれる可能性があります。
Loreleyさんお返事ありがとうございます。
login:と来た後にUserID(とCrLf)を送信したら
ちゃんとUserID(とCrLf)が帰ってきます。
でも、Passwordまで行きません。
もう一回送信しようとすると下記のエラーが出ます。
「実行時エラー'40006':
指定したトランザクションまたは要求のプロトコルまたは接続状態に問題があります。」
そこでWinsockのStateを見てみると、
8(接続を閉じようとしています)になっています。
これはなぜでしょうか?
一回目にはStateは7(接続が完了しました。)なのですが。
また、UserIDは間違いなく存在しています。
また、login:とメッセージが送られて来る際に、「login:^@^@^@^@^@」
というように「^@(&H5E&H40)」が10個近くついてくるのですが、
これはSolarisの仕様なのでしょうか?
質問ばかりで申し訳ありませんが、よろしくお願いします。
んー、Solarisでどうデータが来るのかはわかりませんが、
TERMINAL_TYPEの返答を間違えてるとか?
うちではVT100として返してますけど。
切断されてしまうのは、バイナリ送受してるとき(IACとかの送受信)
時に、ShiftJISで送ってしまったりすると、なりますね。
そういう現象になったことがない
ちょっといじってみます。
そうか、肝心なことを見落としてました。
IAC WILL TRANSMIT-BINARY(&HFF &HFB &H0)」
を送っているのであれば、
UserIDその他もBINARYでの送受信ということになりますよね。
そこにASCIIで送信してるからじゃないですか?
IAC WON'T TRANSMIT-BINARY
にしてみては。
Telnetコマンドというのがあるのを知っていますか?
DOS窓から telnet[RET] と入力すると付属の telnetコマンドが
使えますので、まずそこで普通に接続できることが確認できます。
そこで、telnetオプションを色々変えながら接続を繰り返すことで
どのオプション設定でなら接続できるようになるのかを調べること
ができるので、最初にtelnetコマンドでの接続を確認するのが良い
と思います。
そのあとで有効な設定をコードで再現すればうまく行くような気がします。
遅レス申し訳ありません。
Loreleyさん、猫八さん、レスありがとうございます。
ターミナルタイプはVT100で使用しています。
それとIAC WILL TRANSMIT-BINARYを無くしても変わりませんでした。
TeraTermでもコマンドプロンプトからのTelnetコマンドでもVT100でちゃんと繋がりました。
ここで、Teratermのログを見て送信しているメッセージと同じメッセージを送信してみたのですが、Teratermと同じ返事が返ってきませんでした。
Teratermのログは以下の通りです。
> FF FB 18
> FF FD 03
> FF FB 03
> FF FD 01
> FF FB 1F
< FF FD 18
< FF FD 1F
> FF FA 1F 00 50 00 18 FF F0
< FF FD 23
> FF FC 23
< FF FD 27
> FF FC 27
< FF FD 24
> FF FC 24
< FF FB 03
< FF FD 03
< FF FB 01
< FF FE 23
> FF FC 23
< FF FE 27
> FF FC 27
< FF FE 24
> FF FC 24
< FF FA 18 01 FF F0
> FF FA 18 00 76 74 31 30 30 FF F0
< FF FD 01
> FF FC 01
< FF FE 01
で、Teratermを真似て自分でも「>」の部分をSolarisに送ってみました。
返って来たメッセージは以下の通りです。
FF FD 18
FF FD 1F
FF FD 23
FF FD 27
FF FD 24
00 00 00
FF FB 03
FF FD 03
FF FB 01
FF FE 23
FF FE 27
FF FE 24
FF FA 18 01 FF F0
0D 0A 0D 0A
53 75 6E 4F 53 20 35 2E 38 「SunOS 5.8」
0D 0A 0D 00 0D 0A 0D 00
FF FD 01
6C 6F 67 69 6E 3A 20 「login: 」
5E 40 5E 40 5E 40 5E 40 5E 40 5E 40 5E 40 5E 40 5E 40 5E 40 5E 40
一応Loginは出るし、大体は合っているのですが、Teratermでは最後に「FF FE 01」が返ってきていますが、実際にやってみるとなぜか返ってないみたいです。
で、このあとに
dim byUser(6) as Byte
byUser(0) = &H77 「w」
byUser(1) = &H69 「i」
byUser(2) = &H6E 「n」
byUser(3) = &H64 「d」
byUser(4) = &H0D
byUser(5) = &H0A
Winsock1.Send byUser
とメッセージを送ると、送ったもの「wind(CrLf)」は返ってくるのですが、
Passwordまでいきません。
送るメッセージが悪いのでしょうか?
全然検討もつかないでいます。
よろしくお願いします。
うーん、なんででしょうねぇ。
参考までに、私はTelnetもどきを作ったときに
はじめにサーバーもどきも作ってみました。
つまり、2台で、
windowsのTELNET(以下winTELNET)と自作のサーバ(myServer)を接続、
自作のTELNET(myTELNET)とターゲットのサーバー(Server)を接続。
そして、
1.winTELNETからmyServerに来たものを、
2.そっくりそのままmyTELNETからServerに送り、
3.ServerからmyTELNETに返ってきたものを
4.myServerから、そっくりそのままwinTELNETに返します。(また1にもどる)
これで、loginまでかこつけて、バイナリの意味はその後調べました。
myServerといっても、自作のTELNETの逆をするだけですので、
大して大変でもないと思います。
ところで、
FF FD 01
はIAC WILL ECHOで、文字を表示させるわけですが、
login:をASCIIで送った後、
5E405E405E40をバイナリで送信したところ、
とくに何も表示されませんね。
Telnet側で入力させた文字を画面に反映するようにしてるんですかねぇ。
その近場にSolaris が無いので
ちょっとこれ以上はお力になれないかもしれません(^^;
ちなみに、この状態では、
IDは
バイト配列ではなく、
文字列で送信しないとだめかもしれませんね。
dim uID as string
uID="wind"
winsock1.senddata (uID & vbcrlf)
というように。
Loreleyさん、レスありがとうございます。
以前言われていたので、バイト配列ではなく文字列で送信の方法も
試してみてはいるのですが、全然駄目みたいです。
TelnetのServerもどきは私も考えたのですが、
潰せるPCが無いので断念しました。^^;
Serverに送る電文は上記のもので問題無いのでしょうか?
> IDは
> バイト配列ではなく、
> 文字列で送信しないとだめかもしれませんね。
> dim uID as string
> uID="wind"
> winsock1.senddata (uID & vbcrlf)
> というように。
>潰せるPCが無いので断念しました。^^;
それなら、同じPC上でもできますよ。
127.0.0.1とBINDを使えばいけると思います。
をっと、間違えて送信してしまいました。
Serverに送信する文字はそれで大丈夫だとおもいますよ。
私はそれでやっています。
VB で TELNETを使用して、リモートサーバー上のプログラム
を動かしたいのですが、ソースの書き方が分かりません。
Winsockを使用したらできると書いているのを見かけましたが、
その書き方が分かりません。
何でもいいので、どなたかソースを見せていただけないでしょうか。
ちなみに、 コマンドプロンプトからTELNETを使用した場合はうまく
いきましたので、それをどのように書けばよいかです。
よろしくお願いします。
ツイート | ![]() |