- PR -

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

投稿者投稿内容
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-01-09 11:55
引用:

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

ms-help://MS.MSDNQTR.2003OCT.1041/winsock/winsock/windows_sockets_error_codes_2.htm



 諸農さん、だっめっすよ。これだと「MSDN Liblary Oct.2003」をインストールしていないと見られないっす。

〜〜〜〜〜

 で、VS.NET2003の環境だと、「2003OCT」を、「2003FEB」にすれば、一応表示できました。目次では、次のルートをたどってください。

MSDNライブラリ→ネットワークおよびディレクトリサービス→ネットワークおよびディレクトリサービス→Networking and Directory Services (英語)→Network Protocols→Windows Sockets→SDK Documentation→Windows Sockets 2→Windows Sockets 2 API→Winodws Sockets API Reference→Window Sockets Error Codes

#スペルミスごめん

「Platform SDK: Windows Sockets 2」
[Windows Sockets Error Codes]
これがトピックタイトルなので、これで検索すれば、見つかるんですけどね。


 で、デバッグは、「Dns.GetHostName」のある行の左の方、IDEの境界線あたりの余白をクリックすると、標準では赤い?(変えてるのでわからない)●がつきます。そうやっておいて実行すると、この場所で止まります(ブレークポイント)。止まったら、"GetHostName"あたりにマウスカーソルを移動すると、ヒントとして現在の値が出てきます。もし見られないなら、「Dns.GetHostName」を選択して右クリック、「クイック ウオッチ」。おそらく、自ホストの名称が出てきますよ。
#つうか、わからなかったらMSDNを見ましょう。
#本は「作者」によってかえられていますから、マニュアルを参照しましょう
→ローカル コンピュータの DNS ホスト名を格納する文字列。
↑ということは、Dns.GetHostByName(ホスト名).AddressList
↑ちゃんとMSDN見てから使ってね


[ メッセージ編集済み 編集者: Jitta 編集日時 2004-01-09 11:55 ]
Jubei
ぬし
会議室デビュー日: 2002/03/02
投稿数: 830
お住まい・勤務地: 関西
投稿日時: 2004-01-09 14:53
諸農です。

引用:

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

すいません、指定していただいたURLにアクセスできませんでした。
まだErrorCode値はわかりません。



申し訳ないです。Jittaさんからもコメントがあるように、
先のアドレスはインターネットのアドレスではなく、ローカ
ルコンピュータにインストールした、MSDNのアドレスです。


引用:

Dns.GetHostNameに返ってくる値は、私の確認の方法が悪いのでしょうが
わかりませんでした。



初めてのプログラミングでは、自分でコードを書くということを厭わないことです。
たくさん、自分でコードを書いて、たくさんの無駄なプロジェクトを作ってみるのも
一つの勉強方法だと思います。
※ここでいうプロジェクトは、仕事でのプロジェクトではなく、
 IDE上でのプロジェクトです。

今回の場合、デバッグ確認するためのプログラムプロジェクトを作ってみるのも
一つの解決策かもしれません。

C#で申し訳ないですが、フォームにボタンとリストボックスを貼り付けて
実行状況を確認するコード(プログラムプロジェクト)を作成しました。

コード:
private void button1_Click(object sender, System.EventArgs e)
{
	//DEBUG
	listBox1.Items.Add(Dns.GetHostName());
	IPHostEntry iph = Dns.Resolve(Dns.GetHostName());
	IPAddress[] ips = iph.AddressList;

	//DEBUG
	foreach (IPAddress ip in ips)
	{
		listBox1.Items.Add(ip.ToString());
	}

	IPEndPoint ipe = new IPEndPoint(ips[0],21);

	Socket sc =   new Socket(AddressFamily.InterNetwork,
                                  SocketType.Stream,ProtocolType.Tcp);
	try{
		sc.Connect(ipe);
		byte[] b = new byte[sc.Available];
		sc.Receive(b);
		listBox1.Items.Add(System.Text.Encoding.ASCII.GetString(b));
	}catch(Exception ex){
		SocketException se = null;
		if ((se = ex as SocketException) != null){
			MessageBox.Show(ex.Message +
                                            ": ErrCode = " + se.ErrorCode);
		}
	}finally{
		sc.Close();
	}
}



これで、リストボックスに実行状況が表示されます。
例外発生時にメッセージボックスが表示されます。
こういったプロジェクトを作成すればデバッグがしやすくなります。
デバッグについてはこれからもいろいろと模索してください。
私もまだまだ模索中です。

上記の実行環境はXP PRO で、FTPサービスが可動中です。

#ちなみに、前回アップされていたコードではFTPポートを
 指定しませんから、Dnsの問題が解決できても、多分ですが、
 引き続きエラーが発生することになります。

ではでは(^^)/

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

十兵衛@わんくま同盟
http://blogs.wankuma.com/jubei/
Jubei
ぬし
会議室デビュー日: 2002/03/02
投稿数: 830
お住まい・勤務地: 関西
投稿日時: 2004-01-09 14:55
こんにちわ。諸農です。

引用:

Jittaさんの書き込み (2004-01-09 11:55) より:
 諸農さん、だっめっすよ。これだと「MSDN Liblary Oct.2003」をインストールしていないと見られないっす。



す、すみませんです
で、詳細なフォローアップありがとうございますm(__)m


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

十兵衛@わんくま同盟
http://blogs.wankuma.com/jubei/
御気楽堂
会議室デビュー日: 2004/01/08
投稿数: 8
投稿日時: 2004-01-09 19:54
>jittaさん
ありがとうございます!
私の環境でも、2003FEBに変更したら表示されました
英語……とりあえず、頑張ってこれに目通してます。

後、デバッグですが。
指定の行にブレークポイントを設定して、デバッグ、クイックウォッチをしてみたのですが
名前:Dns.GetHostName 値:式を評価できません
と返されました。

>jubeiさん
そうですね。
初歩的なところから出直して、色々とプログラム書いて
勉強してきた方がいいと痛感してます。

ただ、市販で出てる本のサンプルがそんなにバグだらけはないだろうと思っていたのと
せっかく買った本の内容が間違いだった…と言うのが微妙に悔しくて。

とりあえずこの本は置いといて、違う方法で勉強した方がいいかなとも考えていますが
あー…それも悔しいなぁ…
とりあえずErrorCodeを確認し次第、追って書き込みします。
なちゃ
ぬし
会議室デビュー日: 2003/06/11
投稿数: 872
投稿日時: 2004-01-09 21:48
引用:

御気楽堂さんの書き込み (2004-01-09 19:54) より:
ただ、市販で出てる本のサンプルがそんなにバグだらけはないだろうと思っていたのと
せっかく買った本の内容が間違いだった…と言うのが微妙に悔しくて。


どうでもいいですが、そうなんですか?
いや、ちょっと…
御気楽堂
会議室デビュー日: 2004/01/08
投稿数: 8
投稿日時: 2004-01-09 22:28
なけなしの2500円払って買った本に誤謬が普通にあるってのは…
ちょっと悔しくありません?
おかげで、ここでいい勉強させてもらいましたが。
Jubei
ぬし
会議室デビュー日: 2002/03/02
投稿数: 830
お住まい・勤務地: 関西
投稿日時: 2004-01-09 23:03
諸農です。

引用:

御気楽堂さんの書き込み (2004-01-09 19:54) より:

ただ、市販で出てる本のサンプルがそんなにバグだらけはないだろうと思っていたのと
せっかく買った本の内容が間違いだった…と言うのが微妙に悔しくて。



ちょっとおかしくありませんか?

もともと、対象となっている書籍はVB.NET2002を対象に書かれているものですよね?
サンプルコードをダウンロードして「VS2002」で試してみましたが、
なんら問題なく実行できましたよ。
「vbnetip\2\203\WindowsApplication203」のプロジェクトです。

FCL1.0のSocket接続とFCL1.1のSocket接続では、処理シーケンスの仕様が
変更になっています。
つまり、1.0ではローカルマシンのエンドポイントとリモートマシンのエンドポイントの
両方が必要であるのに対し、1.1のBind()メソッドの説明を読めばわかりますが、
1.1ではConnect()を呼び出すのみになっています。

御気楽堂さんがサンプルコードから引っ張り出してきた部分では、
もともとのサンプルコードにあった「リモート側のIPアドレスを保持しているプロパティ」
から取得するリモートのエンドポイント取得の部分が欠落していたのと、1.1のドキュメ
ントに記載されている内容をちゃんと読んでいないところから、このような事態になって
いるのだと思われます。

私も技術書を出したりしているものですから、
自分の落ち度を棚に上げて、一方的に書籍、およびサンプルコードを「バグ扱い」する姿勢
には、少なからず怒りを覚えます。

こんな発言、著者に対してすこぶる失礼なことではありませんか?
人のコードをバグ扱いできるぐらい、あなたはこのサンプルコードのすべてに
目を通し、すべてのコードの内容を把握したのですか?

前言の発言である「バグ」云々は撤回していただきたいです。
著者および出版社の名誉復活のために尽力してください。
よろしくお願いします。

_________________
諸農和岳
Powered by Borland Delphi/C++Builder & Microsoft VS.NET

[ メッセージ編集済み 編集者: Jubei 編集日時 2004-01-09 23:16 ]
御気楽堂
会議室デビュー日: 2004/01/08
投稿数: 8
投稿日時: 2004-01-10 10:42
>Jubeiさん
すいません、失礼な発言でした。
勉強しなおして、このサンプルコードを理解し、
動かせるようになったらまたお邪魔します。

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