Winsockで一度接続された状態になって
その後、送信側が一方的に遮断(何の信号も出さずに)された場合
WinsockのStateは、7(sckConnected)のままで識別できない
そこで、送信側が一方的に遮断(何の信号も出さずに)されたと言う事を
知る方法ないか教えて下さい
環境は,VB6.0 SP6 WIN2000 or WIN2003
Winsockに詳しくない人間が発言します。ご勘弁を m(_ _)m
Timerを使用して、何秒かに1回Stateを検知してはどうですか?
sckClosingまたはsckErrorが返ってくると思いますが。
(sckClosedかもしれない。・・・どれだろう?)
ヘルプのStateプロパティ(Winsockコントロール)を参考にしました。
・・・いかがですか?
影さん 早速の返信 有難うございます
一方的に遮断(何の信号も出さずに)するので
WinsockのStateは、7(sckConnected)のままです
何らかの通信処理の中での話であれば
相手からの応答にタイムアウトを設け
ある一定時間以上無応答の場合は異常と
みなし、ポートを閉じることで対応可能
と思います。
そうした上で相手の存在を確認するには
Pingを打つ等の手段を用いればいいんじゃ
ないでしょうか。
うーん・・・。
因みに、
>一方的に遮断(何の信号も出さずに)する
とは? 現行で有り得る症例を教えて下さい。
例えば、相手方がPCの電源を落とした、とか。
…定数の名称があるということはWinsockコントロールだよな?
俺のところでは再現できないのだが、
環境を明記して、再現できるサンプルコードをもらえるとちょとうれしい。
俺の環境
WinXP(HOME)
VB6(SP6)
MSWINSCK.oca (ファイルバージョン6.01.9782)
影さん
現行で有り得る症例
相手方は、PCでは無いですが,
現象から見て,電源を落としたと同じ事ですね
横から失礼します・・・
ネットワーク接続で正常に切断した場合、バイナリレベルでは、FINコマンド
がネットワークに流れます。ので、セッションをクローズすることができる
と判断します。ですが、不慮の電源OFFや、ハブの故障、もしくはLANケー
ブルの抜線・破断等で、FINを送りたくても受信できない場合があります。
私は送信時にエラーとなった場合、そのエラー内容を確認し一度ネットワーク
へのシャットダウン・クローズを行い、再度、コネクションを張りなおすよう
にしています。ただ、LANケーブルの破断やハブの故障の場合、シャットダウ
ンすら行なえずエラーとなる場合がありますので、その場合は、強制クローズ
しかありません。
尚、OSが、Win2000/XP の場合、自マシンのネットワークがリンクアップして
いない場合、もう何もできません。リンクダウンした瞬間、即強制クローズ
しないことには、おかしなことになったりしました。
あと自分のマシンのネットワークケーブルが、リンクアップしているかにつ
いては、WMI(ADSI)で、確認することが可能です。確か同じような質問が、
過去にあったので、そこで書いています・・・
過去ログの検索をしてみて下さい。
以上。
PCじゃない・・・。
じゃあ、前の岡田さんのレス例を使用するのがベストでは・・・?
>私は送信時にエラーとなった場合、そのエラー内容を確認し一度ネットワーク
>へのシャットダウン・クローズを行い、再度、コネクションを張りなおすよう
>にしています。ただ、LANケーブルの破断やハブの故障の場合、シャットダウ
>ンすら行なえずエラーとなる場合がありますので、その場合は、強制クローズ
>しかありません。
って部分です。
データ送信時にエラーとして取得するのが、無難じゃないでしょうか。
影さん、ガッさん、岡田さん
有難う御座いました
岡田さんの案を参考に何とかできました
今後も、質問することがあると思いますが
その時もよろしくお願いします
ツイート | ![]() |