- PR -

Socket.Exceptionでハンドルされていない例外

投稿者投稿内容
御気楽堂
会議室デビュー日: 2004/01/08
投稿数: 8
投稿日時: 2004-01-08 15:48
はじめまして、お邪魔します。
最近.NETを触るようになりました。
VBと比べていろいろできるようになったのを楽しみつつ、
VB.NETでFTPクライアントを作ろうと思い立ち、参考書を買って勉強しています。

その参考書を元にFTPクライアントを作っていたのですが、
Socketクラスを使って、接続先のIPとポートを取得して
接続を確立しようと言うメソッドでどうしてもエラーが起きます。

エラーメッセージの内容は、
>'System.Net.Sockets.SocketException' のハンドルされていない例外が
> system.dll で発生しました。
と言うものです。

参考書の.NET Frameworkが2002なためもあってか、
TcpListenerコンストラクタなど、旧形式もいくらかありましたが
気づいた範囲内では修正しましたし、
サンプルプログラムがダウンロードできるので、
ダウンロードして実行してみても、同じエラーが出て途方に暮れています。
どなたか、ご教授お願いします。
Jubei
ぬし
会議室デビュー日: 2002/03/02
投稿数: 830
お住まい・勤務地: 関西
投稿日時: 2004-01-08 16:22
こんにちわ。諸農です。

引用:

御気楽堂さんの書き込み (2004-01-08 15:48) より:

エラーメッセージの内容は、
>'System.Net.Sockets.SocketException' のハンドルされていない例外が
> system.dll で発生しました。
と言うものです。



これだけの情報では、ちょっとコメントし辛いものがありますね

SDKの「SocketException」には次のような解説があります。
現時点で出来ることといえば、例外をトラップしてErrorCodeの値を
確認してみることかもしれません。

引用:

解説
SocketException は、エラーがネットワークで発生したときに、 Socket クラスと Dns クラスによってスローされます。

SocketException クラスの既定のコンストラクタは、 ErrorCode プロパティを直前に発生したオペレーティング システム ソケット エラーに設定します。ソケット エラー コードの詳細については、MSDN で Windows Socket Version 2 API のエラー コードのドキュメントを参照してください。



ではでは(^^)/
_________________
諸農和岳
Powered by Turbo Delphi & Microsoft Visual Studio 2005

十兵衛@わんくま同盟
http://blogs.wankuma.com/jubei/
御気楽堂
会議室デビュー日: 2004/01/08
投稿数: 8
投稿日時: 2004-01-08 16:55
>諸農さん
レスありがとうございます。

ネットワークにエラーが有った時にスローされるんですよね…
接続先IPは、レンタルしてるFTPサーバだし
フリーのFTPクライアントで接続したら、ちゃんと接続できるんで
プログラムの問題…だと思うんですが。

あと、エラーが出ているメソッドは

' Socksによってコントロールコネクションを確立するメソッド
Public Sub Connect()
Dim iphi As IPHostEntry = Dns.Resolve(Dns.GetHostName)
Dim ipa As IPAddress = iphi.AddressList(0)
Dim lep As New IPEndPoint(ipa, 0)
Dim rep As New IPEndPoint(IPAddress.Parse(ip), port)

sc = New Socket(AddressFamily.InterNetwork, _
SocketType.Stream, _
ProtocolType.Tcp)
sc.Bind(lep)
sc.Connect(rep) '←ここ
rc = Receive()
End Sub

こんな感じです。下から二行目にあるReceiveは、後に作ったサーバからの
レスポンスを受信するメソッドです。

サンプルプログラムをhttp://www.vbvbvb.net/jp/guide/ip/code.xml
ここからダウンロードして実行してみたのですが、同様のエラーが出ます。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-01-08 17:09
引用:

御気楽堂さんの書き込み (2004-01-08 16:55) より:

プログラムの問題…だと思うんですが。


 いやいや、だから、プログラムがどのように間違っているから例外的状況になったのかを調べるために、
引用:

Jubeiさんの書き込み(2004-01-08 16:22)より:

例外をトラップしてErrorCodeの値を確認してみることかもしれません。


コード:
' Socksによってコントロールコネクションを確立するメソッド
Public Sub Connect()
    Dim iphi As IPHostEntry = Dns.Resolve(Dns.GetHostName)
    Dim ipa As IPAddress = iphi.AddressList(0)
    Dim lep As New IPEndPoint(ipa, 0)
    Dim rep As New IPEndPoint(IPAddress.Parse(ip), port)

    sc = New Socket(AddressFamily.InterNetwork, _
                    SocketType.Stream, _
                    ProtocolType.Tcp)
    sc.Bind(lep)
    Try
        sc.Connect(rep)
    Catch ex As System.Net.Sockets.SocketException
        MessageBox.Show(ex.Message, ex.ErrorCode.ToString)
        Return
    End Try
    rc = Receive()
End Sub

Jubei
ぬし
会議室デビュー日: 2002/03/02
投稿数: 830
お住まい・勤務地: 関西
投稿日時: 2004-01-08 17:38
諸農です。

引用:

御気楽堂さんの書き込み (2004-01-08 16:55) より:

接続先IPは、レンタルしてるFTPサーバだし

<中略>

' Socksによってコントロールコネクションを確立するメソッド
Public Sub Connect()
Dim iphi As IPHostEntry = Dns.Resolve(Dns.GetHostName)
Dim ipa As IPAddress = iphi.AddressList(0)



コードを斜め読みしただけですが、
借りているサーバーのFTPサービスにアクセスしたいのに、
自分のマシンに対してソケットを開いていませんか?

ご自分のマシンではFTPサービスは稼動していますか?
デバッグ実行しながら確認してみてください。

#その書籍の該当するページには、環境の前提として
#自マシンで云々といったことはかかれていませんか?

ではでは(^^)/

_________________
諸農和岳
Powered by Turbo Delphi & Microsoft Visual Studio 2005

十兵衛@わんくま同盟
http://blogs.wankuma.com/jubei/
御気楽堂
会議室デビュー日: 2004/01/08
投稿数: 8
投稿日時: 2004-01-08 21:12
>Jittaさん
ありがとうございます。
教えてもらったコードに書き換えて実行してみました。
そこで、すいません…ErrorCode値と言うのはどこを見たら確認できるのでしょうか。
グーグルとMSDNで検索してみたのですが、結局わかりませんでした。

Jubeiさん>
重ね重ね、ありがとうございます。
参考書では、マイクロソフトのFTPサーバに接続するように設定していました。
章末に書いてある実行結果の画面でも、マイクロソフトのFTPサーバに接続していました。

この段階ではサーバにFTPコマンドを送信して、
受信したメッセージを表示するだけのプログラムなので、
自PCでFTPサービスが稼動しているかは…関係ありませんよね?
Jubei
ぬし
会議室デビュー日: 2002/03/02
投稿数: 830
お住まい・勤務地: 関西
投稿日時: 2004-01-08 21:50
諸農です。

引用:

御気楽堂さんの書き込み (2004-01-08 21:12) より:

>Jittaさん
ありがとうございます。
教えてもらったコードに書き換えて実行してみました。
そこで、すいません…ErrorCode値と言うのはどこを見たら確認できるのでしょうか。



先の私のコメントを読んでいただけたかと思ったのですが。。

MSDN2003年10月リリース分より

「Platform SDK: Windows Sockets 2」
[Windows Sockets Error Codes]
ms-help://MS.MSDNQTR.2003OCT.1041/winsock/winsock/windows_sockets_error_codes_2.htm

引用:

Jubeiさん>
重ね重ね、ありがとうございます。
参考書では、マイクロソフトのFTPサーバに接続するように設定していました。
章末に書いてある実行結果の画面でも、マイクロソフトのFTPサーバに接続していました。



では、お尋ねしますが、
コード:
Dim iphi As IPHostEntry = Dns.Resolve(Dns.GetHostName) 



このコードの「Dns.GetHostName」の部分は、何が返ってきていますか?
マイクロソフトのFTPサーバーのホスト名でしょうか?
そこからResolveしたIPアドレスはマイクロソフトのFTPサーバーのアドレスですか?
先にも申しましたが、デバッグ実行で確認されましたか?

_________________
諸農和岳
Powered by Turbo Delphi & Microsoft Visual Studio 2005

十兵衛@わんくま同盟
http://blogs.wankuma.com/jubei/
御気楽堂
会議室デビュー日: 2004/01/08
投稿数: 8
投稿日時: 2004-01-09 10:21
>jubeiさん
何度もありがとうございます。
すいません、指定していただいたURLにアクセスできませんでした。
まだErrorCode値はわかりません。

Dns.GetHostNameに返ってくる値は、私の確認の方法が悪いのでしょうが
わかりませんでした。
デバッグ実行だとエラーが出る所まで一直線だったんで、
ステップインも試してみたのですが、混合モードでアセンブリが表示されて、
アセンブリは全然わからなかったので……

とりあえず何度も本を読み返してみたのですが、その行に触れている個所は
”変数iphiは、コントロールコネクションを確立するコンピュータのIPアドレスを取得するために、Dnsクラスのメソッドを利用しています。”
”コネクションの確立元IPアドレスは次のコードで取得しますが、Dnsクラスのメソッドについて説明します。Dns.GetHostNameメソッドは、コンピュータのドメインを取得するメソッドです。そして、Dns.Resolveメソッドは引数に与えられたドメイン名を名前解決します”
”つまり、上記のコードでは、コンピュータのドメイン名を取得して名前解決することで、IPアドレスを取得しています”
と書いてたので、「ああ、そう言うもんなのか」とか思って勝手に納得してました…。

スキルアップ/キャリアアップ(JOB@IT)