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

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

ログ内検索
  • キーワードを複数指定する場合は 半角スペース で区切ってください。
  • 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
  • [返信]をクリックすると返信ページへ移動します。
キーワード/ 検索条件 /
検索範囲/ 強調表示/ ON (自動リンクOFF)
結果表示件数/ 記事No検索/ ON
大文字と小文字を区別する

No.84444 の関連記事表示

<< 0 >>
■84444  サーバー疎通確認について
□投稿者/ くり -(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
親記事 /過去ログ144より / 関連記事表示
削除チェック/

■84450  Re[1]: サーバー疎通確認について
□投稿者/ Azulean -(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 していたら意味がなくなっています。


    ループをやめて、タイマーで定期的に確認するように作り替えませんか?
記事No.84444 のレス /過去ログ144より / 関連記事表示
削除チェック/

■84451  Re[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 していたら意味がなくなっています。
    >
    >
    > ループをやめて、タイマーで定期的に確認するように作り替えませんか?
記事No.84444 のレス /過去ログ144より / 関連記事表示
削除チェック/

■84462  Re[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
記事No.84444 のレス /過去ログ144より / 関連記事表示
削除チェック/

■84486  Re[4]: サーバー疎通確認について
□投稿者/ くり -(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
記事No.84444 のレス /過去ログ144より / 関連記事表示
削除チェック/

■84498  Re[5]: サーバー疎通確認について
□投稿者/ 774RR -(2017/07/07(Fri) 20:36:43)
    ポート番号が違うけど大丈夫?
記事No.84444 のレス /過去ログ144より / 関連記事表示
削除チェック/

■84499  Re[4]: サーバー疎通確認について
□投稿者/ Azulean -(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 を使わないと決断をしたと予想される)
記事No.84444 のレス /過去ログ144より / 関連記事表示
削除チェック/

■84506  Re[5]: サーバー疎通確認について
□投稿者/ くり -(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
    
    
記事No.84444 のレス /過去ログ144より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -