DOBON.NET DOBON.NETプログラミング掲示板過去ログ

TcpIPプログラミングで、ホスト名による接続を行おうとするとSocketExceptionが発生する問題

環境/言語:[【サーバ、クライアント共に】Xp、C#、 .NetFramework 1.1]
分類:[.NET]

C#でTcipIPネットワークプログラミングを作っています。

接続方法は、
まずIPHostEntry型の変数hostを作成し、
そこにDns.Resolve(Address)メソッドの返り値を代入します。
Addressは、ホスト名またはIPアドレスを示すstring型変数です。
その後、host.IPAddressList[0]と、ポート番号を基にIPEndPoint型変数ipEPを作成し、
TcpClient型変数tcpCのconnectメソッドを作成したipEPを引数に呼び出すというものです。

Addressが、IPアドレス、"192.168.0.1"のような形式だと上手くいくのですが、
Addressがhost名、"hoge.hogehoge.hoge.co.jp"のような形の場合、

Dns.Resolve(Address)の返り値をhostに代入しようとした段階で、
以下のような例外がスローされてしまい、うまくいきません。

SocketException:
要求した名前は有効で、データベースにありますが、解決された正しい関連データがありません。

Dns.Resoleveの使い方が悪いのかと思い、
TcpClient tcpC = new TcpClient("hoge.hogehoge.hoge.co.jp",12345);
のように、直接ホスト名を打ち込んでデバッグしてみましたが、
やはり同じ例外がスローされてしまいます。
しかし、IPアドレスで指定すると、
うまく接続が完了できます。

MSDNで発生するSocketExceptionやDns.Resolveメソッドを調べてみたのですが、
どうも要領を得ません。

解決策や、ヒントなどを知っている方、思いつかれた方は、
何卒ご助力をお願いします。
申し訳ないです。コードを記し忘れました。
以下が該当メソッドのコードです。

//サーバへの接続メソッド
public bool Connect(string Address)
{
//IPHostEntryのインスタンスを作成し、Dns.Resolveの返り値を代入。ホスト名とIPアドレスの両方を取得する。
    IPHostEntry host = Dns.Resolve(Address);

//ホストが存在するかどうかをチェックする。
    if(Dns.GetHostByAddress(host.AddressList[0]) == null )
    {
        return false;
    }

//指定のIPアドレスと既定のポート番号でIPEndPointのインスタンスを作成
    this.ipEP = new IPEndPoint(host.AddressList[0],Client.port);


//IPEndPointのインスタンスを引数にTcpClientのインスタンスを接続。NetStreamも取得する。
    try
    {
        this.tcpC.Connect(this.ipEP);
        this.stream = this.tcpC.GetStream();
        this.GiveMeANews(this.form.userName);
    }
    catch(Exception)
    {
        return false;
    }

    return true;
}
2004/07/11(Sun) 03:50:00 編集(投稿者)

単なるTCP/IPによるソケット通信であれば、私のサイトにVB.NETではありますが、
サンプルがあります。受信と送信サンプルプログラムです。
ホスト名でも接続可能です。

P.S.あくまで判りやすく作ったサンプルなので、文字を送受信するといった内容ですが、ホスト接続については理解できると思います。
ペガサス研究室さま、返信ありがとうございます。

サンプルを参考に、もう一度ゼロから組みなおしてみたいと思います。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板