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

NETのソケットクラスについて

環境/言語:[windowsXP VB.NET2005 NET Framework2.0]
分類:[.NET]

毎回、お世話になっております。

前回したFTPの質問に被ってしまうところがあるのですが、
ソケットのクラスについて質問があります。

下記のようなソース(.NETのsocketクラス使用)でサーバに接続要求を行い、応答が帰ってこない為か、例外も発生せずにプログラムが止まってしまいました。

原因は下記が考えれば納得できるのですが、逆にLANケーブルを抜いたり、
接続先を存在しないIPにした時は正常?にエラーを返します。

無期限で応答を待つようにしていれば、結局はプログラムは待ち状態になるのでは?
と思うのですが、そうならない理由がわかりません。

どうか、よろしくお願い致します。

原因:ReceiveTimeout、SendTimeoutの値をデフォルト(0)にしていた為に、
   無期限で待つような設定になっていた

---- ソース -----
'ソケットオブジェクト生成
m_objClientSocket = _
New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
'接続情報設定
Dim ep As New IPEndPoint(Dns.Resolve(m_sRemoteHost).AddressList(0), m_iRemotePort)

'接続要求開始
Try
m_objClientSocket.Connect(ep)
Catch ex As Exception
MessageString = "Cannot connect to the remote server"
Return False
End Try
2009/05/11(Mon) 15:05:58 編集(投稿者)

■No24528に返信(みけんにしわさんの記事)
> 無期限で応答を待つようにしていれば、結局はプログラムは待ち状態になるのでは?
> と思うのですが、そうならない理由がわかりません。

Socket の実装は調べていませんが:

LAN ケーブルを抜くなど、通信障害になればそこで通信が途切れ、
存在しない IP に接続した場合、そもそも通信自体が行われないという事で、
通信が続いている「応答待ち」とは、異なる状態なのでは無いでしょうか。


携帯電話でいうと、通信障害(圏外など)が発生した場合や、
存在しない電話番号にかけた場合、そこで通話は終わりですよね。

しかし通話中の状態のまま、相手が離席して受話器を切らずに放置していたら、
こちらから切断しない限りは回線が接続されたままになるかと思います。(応答待ち)

それと似たような話になるのかな、と想像…。
こんにちは。

返信ありがとうございます。

> LAN ケーブルを抜くなど、通信障害になればそこで通信が途切れ、
> 存在しない IP に接続した場合、そもそも通信自体が行われないという事で、
> 通信が続いている「応答待ち」とは、異なる状態なのでは無いでしょうか。
>
> 携帯電話でいうと、通信障害(圏外など)が発生した場合や、
> 存在しない電話番号にかけた場合、そこで通話は終わりですよね。
>
> しかし通話中の状態のまま、相手が離席して受話器を切らずに放置していたら、
> こちらから切断しない限りは回線が接続されたままになるかと思います。(応答待ち)
>

下記イメージでよいでしょうか?
<通信障害時>
1.クライアント →→接続要求→→ サーバ(ネットワーク未接続)
2.クライアント ←←エラー←← プロトコル?

1で接続要求をしたが、サーバがいない為に何処(プロトコル?)からエラーが帰ってくる。

<通信正常時>
1.クライアント →→接続要求→→ サーバ(要求取得)
2.クライアント          サーバ(何らかの理由により応答を返さない)

1で接続要求を行い、サーバに要求が通ったがサーバ側が何らかの理由により、
応答を返さない。

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