忍者ブログ
暇人おやじの暇なつぶやき
[1] [2] [3]
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

■ソケットの相手が切断したを知るために

サーバー側で複数の接続を処理している場合、相手から切断されたらそのソケットを破棄して以後はそのソケットを処理しない様にしなければならない

その為、相手(クライアント)からの切断要求をうけいれるようにしないとならない
これには 「BeginDisconnect」 を使う そしてまたこれもcallback関数
http://msdn.microsoft.com/ja-jp/library/system.net.sockets.socket.begindisconnect.aspx
を参考にどうにか実装

参考ページにはVBのサンプルがないので、c#のサンプルを改造して、どうにかうまくいったけど
マイクロソフトのページって、サンプル自体もそのままじゃ動かないから、超大変でR

てことでコードは次のような感じ

        client.BeginDisconnect(True, New AsyncCallback(AddressOf DisconnectCallback), client)

このBeginDisconnect はクライアントの処理中に記載
んで、次のがcallback関数「DisconnectCallback」
    Private Sub DisconnectCallback(ByVal ar As IAsyncResult)
        ' 切断要求の処理
        ' Complete the disconnect request.
        Dim client As Socket = CType(ar.AsyncState, System.Net.Sockets.Socket)
        Console.WriteLine("Disconnect:" & client.RemoteEndPoint.ToString())
        client.EndDisconnect(ar)

        ' Signal that the disconnect is complete.
        '   disconnectDone.Set()
    End Sub
disconnectDoneというのはC#の記載で、どうもイベントの通知のようなのですが、これをVBでどのようにするか不明なので、コメントアウト とりあえずはこれで切断の要求に応えることは出来た
PR
■BeginAccept で複数のクライアントと接続を試みる

socket通信でサーバープログラムを書く場合、サーバーになるためには複数の接続先からの接続要求に
応えないとならない

.NETには「TcpListener」などの受信を行なうためのクラスが用意されているが、単純にこれを使った場合には
複数からの接続に対応は出来ない

そこで、socketクラスのBeginAcceptを実装することで、複数の接続から対応するコードを書く

しかしこれには「Callback」関数を定義しなければならない、また.NETでのコールバックはデリゲートで
なんたらかんたら・・・という説明が色々出てきて、ハッキリ言おう、よく分からん

でだ
http://codezine.jp/article/detail/22?p=1 にあるサーバーのプログラムというコードと
http://msdn.microsoft.com/ja-jp/library/5bb431f9.aspx にある例を見つつ

どうにかこれらcallbackの動きを把握できた

通常の接続待ちではブロックされるため、socket.accept()命令でプログラムは待機する

しかし、BeginAcceptを使った場合、待機は別スレッドが行い、本体は次のコードを実行する
なので、socket.accept()のコードを単純にBeginAcceptに変更しただけではまったく意味がないのでR


■BackgroundWorkerコンポーネントについてのメモ

BackgroundWorkerはスレッド処理を行うコンポーネントであり
非常に簡単にスレッドを追加してくれます

またreportsprogressプロパティを設定することによりスレッドの進行内容の通知が確認できます
suportscancellationプロパティを設定することでスレッドの途中キャンセルも正確に行なえます

進行状況の通知を行なうには、実はアプリケーションで状態を通知する必要があります
これは、スレッド実行イベント(dowork)内にてchangeprogressイベントを呼び出します

次の例はフォームにボタン、テキストボックス、バックグランドワーカーを設置して簡単なスレッドの
テストを行なうものです

スレッドの実体である dowork イベントに
       Dim cnt As Integer = 0

        While cnt < 5
            System.Threading.Thread.Sleep(1000)
            cnt += 1
            BackgroundWorker1.ReportProgress(cnt)
        End While

進行状態を処理するイベント ProgressChanged に
        TextBox1.Text += "..."
        TextBox1.Text += e.ProgressPercentage.ToString
        TextBox1.Text += vbCrLf

そしてスレッドが終了時に通知されるイベント RunWorkerCompleted に
        TextBox1.Text += "End Of Thread!!"

起動させるために、ボタンに次のコードを
        BackgroundWorker1.RunWorkerAsync()

これで、簡単な確認が出来ます
ReportProgressに値(cnt)を渡していますが、これが進行状態のパーセンテージ値になり
実体のイベント ProgressChanged に e.ProgressPercentage として渡ることになります
実はパーセンテージ自体はアプリケーション側で対応しないとならず、この数値は実際の
パーセンテージを表しているわけでは無いのです




忍者ブログ [PR]
カレンダー
07 2024/08 09
S M T W T F S
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
フリーエリア
最新CM
最新TB
プロフィール
HN:
忍者 シオ才
性別:
非公開
バーコード
ブログ内検索