C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[5]: サーバー疎通確認について


(過去ログ 144 を表示中)

[トピック内 8 記事 (1 - 8 表示)]  << 0 >>

■84444 / inTopicNo.1)  サーバー疎通確認について
  
□投稿者/ くり (1回)-(2017/07/05(Wed) 18:29:16)

分類:[.NET 全般] 

初めましてこんにちは!

vb.net2010で社内用ツールを作成しておりますが、
サーバーの疎通確認で「応答なし」になります。
ならない方法なにかありましたらご教示のほどよろしくお願い致します。

    'ネットワークに接続されているか調べる
        If My.Computer.Network.IsAvailable Then   'ここで社内ネットワークでなく、外部の無線に接続してしまうと「応答なし」になってしまう
            ' Console.WriteLine("ネットワークに接続されています")

            Do Until IsInternetConnected() ’DBサーバー確認

                System.Threading.Thread.Sleep(5000)

                System.Windows.Forms.Application.DoEvents()

            Loop
           
            con_flg = True
        Else
            'Console.WriteLine("ネットワークに接続されていません")
      
       con_flg = false
        End If

引用返信 編集キー/
■84450 / inTopicNo.2)  Re[1]: サーバー疎通確認について
□投稿者/ Azulean (831回)-(2017/07/05(Wed) 21:56:39)
No84444 (くり さん) に返信
> Do Until IsInternetConnected() ’DBサーバー確認
> System.Threading.Thread.Sleep(5000)
> System.Windows.Forms.Application.DoEvents()
> Loop

このループに入ったら「応答なし」になることは必然です。

「応答なし」にしないためには、イベントから抜けることが第一です。
何らかのイベントの中でループする、待つ(Sleep する)と、Windows 側に制御が戻らないので「応答なし」になります。

次点は DoEvents を呼ぶことですが、5 秒も Sleep していたら意味がなくなっています。


ループをやめて、タイマーで定期的に確認するように作り替えませんか?
引用返信 編集キー/
■84451 / inTopicNo.3)  Re[2]: サーバー疎通確認について
□投稿者/ くり (2回)-(2017/07/06(Thu) 08:46:24)
Azulean様、ご回答ありがとうございます。

> ループをやめて、タイマーで定期的に確認するように作り替えませんか?
ぜひご教示のほどよろしくお願い致します。

現在では、ネットワークの接続状況を「My.Computer.Network.IsAvailable」で検出してから
実際に利用する、DBサーバーに接続できるか「ループ」で確認しておりますが、
タイマーでの実装方法ご教示いただけませんでしょうか。



No84450 (Azulean さん) に返信
> ■No84444 (くり さん) に返信
>> Do Until IsInternetConnected() ’DBサーバー確認
>> System.Threading.Thread.Sleep(5000)
>> System.Windows.Forms.Application.DoEvents()
>> Loop
>
> このループに入ったら「応答なし」になることは必然です。
>
> 「応答なし」にしないためには、イベントから抜けることが第一です。
> 何らかのイベントの中でループする、待つ(Sleep する)と、Windows 側に制御が戻らないので「応答なし」になります。
>
> 次点は DoEvents を呼ぶことですが、5 秒も Sleep していたら意味がなくなっています。
>
>
> ループをやめて、タイマーで定期的に確認するように作り替えませんか?
引用返信 編集キー/
■84462 / inTopicNo.4)  Re[3]: サーバー疎通確認について
□投稿者/ くり (3回)-(2017/07/06(Thu) 12:35:14)
追記--
下記VB6のサーバー確認コードをVB.NET2010で書きたいですが、
ご教示のほどよろしくお願い致します。

Private Const IP_Addr = "192.168.0.1"
Private Const Interval = 0.3
Private Sub StopTime(st As Single)
'タイマー関数を使って Sleep 関数と同様の関数を作成

Dim sngSt As Single
sngSt = Timer
Do While Timer - sngSt < st
DoEvents
Loop

End Sub
Sub main()


Dim IP As Integer
Dim Winsock1 As New Winsock

Form1.Timer1.Enabled = True

Winsock1.RemoteHost = IP_Addr
Winsock1.RemotePort = 1345 '
Winsock1.Connect
StopTime Interval
If Winsock1.State = 7 Then
'接続完了

Else
'接続失敗


End If

Winsock1.Close


End Sub
引用返信 編集キー/
■84486 / inTopicNo.5)  Re[4]: サーバー疎通確認について
□投稿者/ くり (5回)-(2017/07/07(Fri) 12:56:57)
追記---

vb.net2010参照設定にて「MSWinsockLib」を参照し
エラーなく、実行できるが、正しく結果が得られません。
どうしてでしょうか?ご教示のほどよろしくお願い致します。

 Public Function IsInternetConnected() As Boolean


        Const server = "192.168.0.1"
        Const Port = 1234

        Dim Winsock1 As New Winsock

        Winsock1.RemoteHost = server
        Winsock1.RemotePort = Port   
        Winsock1.Connect()

        If Winsock1.State = 7 Then  ’正しく接続されているにも拘らず、6(close)になる
            '接続完了
            IsInternetConnected = True

        Else
            '接続失敗
            IsInternetConnected = False

        End If
        Winsock1.Close()
    End Function

引用返信 編集キー/
■84498 / inTopicNo.6)  Re[5]: サーバー疎通確認について
□投稿者/ 774RR (538回)-(2017/07/07(Fri) 20:36:43)
ポート番号が違うけど大丈夫?
引用返信 編集キー/
■84499 / inTopicNo.7)  Re[4]: サーバー疎通確認について
□投稿者/ Azulean (833回)-(2017/07/07(Fri) 21:55:20)
2017/07/07(Fri) 22:06:02 編集(投稿者)

No84451 (くり さん) に返信
>>ループをやめて、タイマーで定期的に確認するように作り替えませんか?
> ぜひご教示のほどよろしくお願い致します。
(略)
> タイマーでの実装方法ご教示いただけませんでしょうか。

いやいや、自分で調べてわからないところを聞いてください。
あなたがどこまで理解しているかわからない状態で教えるだけでも困難(or無理)なのに、実装方法まで教えて欲しいはさすがにつらいです。

タイマーをまったく知らない状態からなら、まずはタイマーを知ることから始めた方が良いでしょう。
性質を理解せずに使うのは、プログラマーとして危ういので…。
https://msdn.microsoft.com/ja-jp/library/3tszykws など。

タイマーを使って等価の処理を書く方法を考えるのはあなた自身の仕事(課題)です。


No84462 (くり さん) に返信
> 下記VB6のサーバー確認コードをVB.NET2010で書きたいですが、
> ご教示のほどよろしくお願い致します。

まず、Winsock コントロールは VB6 向けの ActiveX コントロールであって、VB.NET 世代で使うことは想定されていないはずです。
また、ActiveX コントロールは脆弱性が見つかったなどの理由で無効化されていくこともよくあるので、.NET に移植するなら Socket クラスを使うように改修した方がいいとは思います。

それを決めるのはあなた自身ですので、そのまま続行することを止めたいわけではありません。


> 'タイマー関数を使って Sleep 関数と同様の関数を作成

コメントに惑わされていますが、VB6 のコードは Sleep 動作ではありません。
移植時に意味をきちんと理解していかないとダメですよ。
同等動作にしたいだけなら、VB.NET のコードの Thread.Sleep 削ったら良いとは思いますけどね。
(VB6 のコードは、一定時間待ちたいけど、メッセージループを止めたくない(応答なしにしたくない)から Sleep を使わないと決断をしたと予想される)
引用返信 編集キー/
■84506 / inTopicNo.8)  Re[5]: サーバー疎通確認について
□投稿者/ くり (6回)-(2017/07/10(Mon) 11:06:10)
Azulean 様ご回答ありがとうございます。
ご指摘の通り、理解不足かつ安易に他人に答えを得ようとする自分がありました。
申し訳ありませんでした。

まだまだ、理解不足ではありますが、色々テストして、vb6の「mswinsck」ではスムーズに動きますが、
.netではスムーズに動かないです。

例えば:あきらかにネットワークが切断した場合では、両方ともスムーズに動きますが、
ネットワークが接続された状態(内部と外部)で接続した状態では、vb6[mswinsck]の方がスムーズに
戻り値が得られますが、<.net>下記のコードでは、戻り値が得られまで時間が掛かる。
もし、なにか解消方法ございましたら、ご教示のほどよろしくお願い致します。

<vb.net2010+.net2.0>

    Function CheckPortOpen(ByVal hostname As String, ByVal portnum As Integer) As Boolean

        Dim ipa As IPAddress = CType(Dns.GetHostAddresses(hostname)(0), IPAddress)

        Try
            Dim sock As Socket = New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
            'Console.WriteLine("Testing " & hostname & ":" & portnum)
            sock.Connect(ipa, portnum)  '(外部ネットワークに接続されている場合、時間が掛かる)
            If (sock.Connected = True) Then
                sock.Close()
                sock = Nothing
                Return True
            End If

        Catch sx As SocketException
            If sx.ErrorCode = 10061 Then
                Return False
            Else
                Return Nothing
            End If

        End Try

    End Function


引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -