none
Udp通信で値の取得方法がわかりません。 RRS feed

  • 質問

  • UDP通信で受信するソフトをVB2008Expressで考えています。

    単純に受信した内容をLabelに表示するだけです。

    あるサイトの例を参考にコードを書いてみました。

    ------------------------------以下使用コード------------------------
    Imports System
    Imports System.Net
    Imports System.Net.Sockets
    Imports System.Text

    Public Structure UDPState
        Public e As Net.IPEndPoint
        Public u As Net.Sockets.UdpClient
    End Structure

    Public Class Form1
        Public S As UDPState
        Public DATAstring As String

        Public Sub receivecallback(ByVal AR As IAsyncResult)
            Dim LU As Net.Sockets.UdpClient = CType(AR.AsyncState, UDPState).u
            Dim LE As Net.IPEndPoint = CType(AR.AsyncState, UDPState).e
            Dim receiveBytes As Byte() = LU.EndReceive(AR, LE)
            Dim receiveString As String = System.Text.Encoding.ASCII.GetString(receiveBytes)
            Dim receiveAddress As System.Net.IPAddress = LE.Address
        End Sub

        Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
            S = New UDPState
            S.e = New Net.IPEndPoint(Net.IPAddress.Any, 6000)
            S.u = New Net.Sockets.UdpClient(S.e)
        End Sub

        Private Sub Timer1_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles Timer1.Tick
            S.u.BeginReceive(AddressOf receivecallback, S)
      End Sub

    receivecallback内にブレイクを置いてreceiveString内に必要な内容が着ていることは確認できるのですが
    実際Labelに表示しようと思うと何処にその記述をしたら良いのか?

    receivecallback内に
           Label1.Text=receiveString を記述すると怒られました。
    たぶん、Timer1_Tick内に記述すると思うんですがどのようにしたら良いのかがわかりません。
    そもそも上のコードを完全把握していないのも原因なんですがMSDNを調べてもさっぱり検討がつきません。
    どなたかお教え願いたいのですが、よろしくお願いします。

    2009年6月13日 10:11

回答

  • 怒られました、で完結せず、どういう点で怒られているのか、エラーメッセージを読みましょうよ。

    そしてエラーメッセージを google とかで検索すれば結構解決方法そのものが見つかるモンです。
    2009年6月13日 10:50

すべての返信

  • 怒られました、で完結せず、どういう点で怒られているのか、エラーメッセージを読みましょうよ。

    そしてエラーメッセージを google とかで検索すれば結構解決方法そのものが見つかるモンです。
    2009年6月13日 10:50
  • 返信ありがとうございます。

    決して『怒られた』で完結していたわけだないのですが・・・

    『怒られた』内容が、【スレッドセーフではない】と言う事はわかりました。

    なので『receivecallback内ではLabel表示は行えないな』っと思ったわけです。

    ここでもう一点気になったのがTimer1_Tick内のS.u.BeginReceive(AddressOf receivecallback, S)です。

    このコードがあったサイトではS.u.BeginReceive(AddressOf receivecallback, S)が引数を持ってくるような

    書き方だったのでこれを利用してLabelに表示させるものと考え、調べていました。

    よくよく考えたら【スレッドセーフでない】なら【スレッドセーフ】にすればいいですね?

    receivecallback内にデリゲートを作ってLabelに表示すればよかったのですね。

    実際やってみてうまくいきました。少々頭が固くなっていたようです。

    ただ、この方法も最適な方法なのか。。。また調べまくってみます。
    2009年6月13日 11:33