UDP通信によるデータを受信するには??


SHINJO  2004-11-16 03:38:21  No: 86684

現在、UDPプロトコルを使用し、サーバからクライアントへ時刻データを
送るプログラムを作成しているのですが、サーバ側からのデータの送信は
出来ていると思うのですが、クライアント側でデータを受信することが出
来ません。いろいろ調べてはいるのですが、原因がわかりません。
以下にプログラムを記載しますので、教えてください。
<<<サーバ>>>
Private Sub Command1_Click()
    Winsock1.Close                          '接続を閉じる
    Winsock1.LocalPort = 0                  '自ポート123を開放する
    Unload Me
    End
End Sub
'--------------------------------------------------------------------------------

Private Sub Form_Load()
    '接続先ポートの設定
    Winsock1.Close                          '接続を閉じる
    Winsock1.RemoteHost = "192.168.0.86"    '接続先アドレスの設定
    Winsock1.RemotePort = 123               '接続先ポートの設定
    Winsock1.Connect                        '自ポートの設定
End Sub
'--------------------------------------------------------------------------------

Private Sub Timer1_Timer()
    Label1.Caption = Format(Now, "hhmmss")  '現在時刻の取得
End Sub

Private Sub Timer2_Timer()
    Label2.Caption = Label1.Caption
    Winsock1.SendData Label2.Caption         'データを送信する
End Sub
'--------------------------------------------------------------------------------

<<<クライアント>>>
Dim Jtime  As String              '受信データ用文字列を宣言
Dim Htime  As String              '時用文字列を宣言
Dim Mtime  As String              '分用文字列を宣言
Dim Stime  As String              '秒用文字列を宣言
Dim LoopNo As Integer             'ループ用変数の宣言

'テスト用変数
Dim TestA As Integer
Dim TestB As Integer
Dim TestC As Integer
'--------------------------------------------------------------------------------

Private Sub Command1_Click()   '終了処理
    If Winsock1.State <> sckClosed Then    'Winsockの状態(閉じていない)
        Winsock1.Close                     'Winsockを閉じる
    End If
    Unload Me
    End
End Sub
'--------------------------------------------------------------------------------

Private Sub Form_Load()
    Winsock1.LocalPort = 123    '接続要求受付ポート番号設定
    Winsock1.Listen             '接続要求待ち
End Sub
'--------------------------------------------------------------------------------

Private Sub Winsock1_ConnectionRequest(ByVal requestID As Long)
    If Winsock1.State <> sckClosed Then    'Winsockの状態(閉じていない)
        Winsock1.Close                     'Winsockを閉じる
    End If
    Winsock1.Accept requestID              '接続処理
    Text2.Text = TestC
    TestC = TestC + 1

End Sub
'--------------------------------------------------------------------------------

Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
    Winsock1.GetData Jtime         'クライアントからデータを受信
    Text1.Text = Jtime

    '受信データから時分秒ごとに変数へ代入する
    Htime = Mid(Jtime, 1, 2)       ' "時"を Htime へ代入
    Mtime = Mid(Jtime, 3, 2)       ' "分"を Mtime へ代入
    Stime = Mid(Jtime, 5, 2)       ' "秒"を Stime へ代入

    Label1.Caption = Htime         ' "時"を表示する
    Label3.Caption = Mtime         ' "分"を表示する
    Label5.Caption = Stime         ' "秒"を表示する
    
    Label7.Caption = TimeSerial(Htime, Mtime, Stime) '時刻表示する

    Label9.Caption = TestB
    TestB = TestB + 1

End Sub
'--------------------------------------------------------------------------------


ガッ  2004-11-16 06:20:22  No: 86685

※久々の投稿…また誤爆しなければ良いが…
…UDP?
で、GetDataの第二引数にはvbStringを使ったほうがいいと思うが…まぁ多分動くんだろうがなぁ。

動作がよく分からないときには、随所にデバッグアウトを入れるのがいいと思われる。
で、クライアントさんもListenしているのも不明(orz
きっとクライアントとサーバが逆に書かれていると思われるが。

あとはー
…サーバさんがデータを送っている部分の、
>Private Sub Timer2_Timer()
>    Label2.Caption = Label1.Caption
>    Winsock1.SendData Label2.Caption         'データを送信する
>End Sub
だが、この時点で「送れる状態」なのかを確認していない気がする。
まぁ、それでもエラーが起こるだけなんだと思うが。

…全体的に不明です(ぇ
とりあえず、「動くだけの最小のプログラム」をこつこつ作って見たらどうだろう?
そうすれば、どこがいけないのかが見えてくると思われる。


。。。  2004-11-16 07:05:56  No: 86686

UDPを使ってるのですか?
提示されているコードはTCP処理のものですよ。
UDPを使うのにAcceptメソッドとかは使いません。
変わりにBindメソッドを使用します。

使い方はMSDNの『Winsock (Winsock) コントロールの使い方』を見てください。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加