none
AxWinSockの設定方法 RRS feed

  • 質問

  • VB6では動作するWinSockの設定がVB2005では動作しない??

    VB6での設定

    Winsock1.Bind(10002)

    をVB2005への変換時エラーとなり変換してくれない。

    Winsock1.LocalPort = 10002

    と変更し下記の設定とした。

    Winsock1.Protocol = MSWinsockLib.ProtocolConstants.sckUDPProtocol
    Winsock1.RemoteHost = "192.168.150.31"
    Winsock1.RemotePort = 10001
    Winsock1.LocalPort = 10002

    ビルドのエラーが無くなり正常に動作すると思いきや、送信時10049エラーとなる。

    受信は出来るのかチェックしたが受信も不可。

    ポートモニターではローカルポート10002は認識されていて表示が出る。

    WinSockの設定方法のわかる方ご指導下さい。

    2007年3月2日 12:11

回答

  • VB2005でこういうソフトを作った事が無いのですが、後の事も考えて、少し調べてみました。
    その前にあなたの MSWinsockLib というものが分からないのですが、Winsock1.Protocol へ入れるのは0,1いずれかで、UDPなら=0で良いはずです。 先にこれをやってみてはいかがですか。

    次にVB2005の場合、UDPprotocolなら、SocketクラスよりUdpClientクラスを使う方が簡単なようです。 下記はVB2005ヘルプのサンプルから写して手入れしたものですが、動く事を確認できました。
    Private Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button2.Click
    '---by vb2005---
      LabMssg.Text = ""                 '表示用Labelコントロール
      Dim listenPort As Integer = 1001
      Dim listener As New UdpClient(listenPort)
      Dim groupEP As New IPEndPoint(IPAddress.Any, listenPort)
      Dim bytes As Byte() = listener.Receive(groupEP)
      Dim moj As String = Encoding.ASCII.GetString(bytes, 0, bytes.Length)
      listener.Close()
      LabMssg.Text &= moj
    End Sub
    上記は単にButtonに機能をはめ込んでいるだけで、実際には使えませんが、機能の確認はできます。 無信号の場合、Receiveメソッドで延々と待ちますので、注意が必要です。
    ポート番号は自分側のを設定するのでしょう、多分。 IPAddress.Anyは何でもOKという意味のようです。 UDPプロトコルですから、もう一つのポート番号は無指定でOKのはずです。 データ発信側はSend()メソッドで出来そうですが試してません。 発信側はVB6で作ったものを使ってテストしました。

    2007年3月13日 15:06

すべての返信

  • VB2005ではSocketクラスを使うのが普通じゃないでしょうか。
    OCXですからVB6で用意されたWinSockコントロールも原理的には使えるかもしれませんが、開発ツールをVB2005に切り替えたなら、.NetFlamework2で用意されたものを使う方がスムーズと思います。

    2007年3月9日 17:20
  • 葉流奈津さん返信ありがとうございます。

    出来ましたら .NetFlamework2 での設定例(UDP接続)を教えていただければと思います。

    Microsoft VB Developer Center に [ソケット通信を実装する方法について] で VB6 と .NET の

    場合の設定方法が書いてあったのですがよくわからないです。

    よろしくお願い致します。

     

     

     

     

    2007年3月12日 15:24
  • VB2005でこういうソフトを作った事が無いのですが、後の事も考えて、少し調べてみました。
    その前にあなたの MSWinsockLib というものが分からないのですが、Winsock1.Protocol へ入れるのは0,1いずれかで、UDPなら=0で良いはずです。 先にこれをやってみてはいかがですか。

    次にVB2005の場合、UDPprotocolなら、SocketクラスよりUdpClientクラスを使う方が簡単なようです。 下記はVB2005ヘルプのサンプルから写して手入れしたものですが、動く事を確認できました。
    Private Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button2.Click
    '---by vb2005---
      LabMssg.Text = ""                 '表示用Labelコントロール
      Dim listenPort As Integer = 1001
      Dim listener As New UdpClient(listenPort)
      Dim groupEP As New IPEndPoint(IPAddress.Any, listenPort)
      Dim bytes As Byte() = listener.Receive(groupEP)
      Dim moj As String = Encoding.ASCII.GetString(bytes, 0, bytes.Length)
      listener.Close()
      LabMssg.Text &= moj
    End Sub
    上記は単にButtonに機能をはめ込んでいるだけで、実際には使えませんが、機能の確認はできます。 無信号の場合、Receiveメソッドで延々と待ちますので、注意が必要です。
    ポート番号は自分側のを設定するのでしょう、多分。 IPAddress.Anyは何でもOKという意味のようです。 UDPプロトコルですから、もう一つのポート番号は無指定でOKのはずです。 データ発信側はSend()メソッドで出来そうですが試してません。 発信側はVB6で作ったものを使ってテストしました。

    2007年3月13日 15:06
  • 葉流奈津さん返信ありがとうございます。

    UdpClientのサンプルをVB6->2005 自動変換したプログラムに埋め込み、テストしたのですがなかなか動作せず

    それではと思い新規プロジェクトとして、この処理だけのを作り動作させましたらうまくいきました。

    サンプルそのままでは受信で待ってしまうので、VB6で送受信を作り、VB2005側では受信したデータを自動返信する

    様にしました。

    ---------------------------------------

    Imports System.Net
    Imports System.Net.Sockets
    Imports System.Text

    Public Class Form1
        Dim listenPort As Integer = 1001
        Dim listener As New Sockets.UdpClient(listenPort)
        Dim groupEP As New IPEndPoint(IPAddress.Any, listenPort)
        Dim EP As New IPEndPoint(IPAddress.Parse("192.168.150.100"), 1002)
        Dim bytes As Byte()
        Dim moj As String

        Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
            Label1.Text = ""
            Timer1.Interval = 200
            Timer1.Enabled = True
            listener.Connect(EP)
        End Sub

        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)    Handles Button1.Click
            Me.Close()
        End Sub

        Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
            Label1.Text = ""
        End Sub

        Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
            If listener.Available > 0 Then
                bytes = listener.Receive(groupEP)
                moj = Encoding.ASCII.GetString(bytes, 0, bytes.Length)
                Label1.Text = moj
                listener.Send(bytes, bytes.Length)
            End If
        End Sub
    End Class

    ---------------------------------------

    尚、MSWinsockLib ....は、VB6の Winsock1.Protocol = sckUDPProtocol を自動変換してくれたものです。

    VB6にしてもVB2005にしてもUDPの場合 1  になっていると思うのですが。

    これでなんとかAxWinsock を使わずにいけそうです、当初このUdpClientが動作しないので Socket を使う方法も

    色々試してみたのですが埋め込んでテストしたせいか送信はできたのですが受信が出来ずじまいです。

    Socket を使いこの処理だけとして作って、テストしてみようと思っています。

    AxWinsock の設定方法も気になりますが、とりあえず解決としたいと思います。

    ご協力ありがとうございました。

     

    2007年3月23日 3:36
  • 追伸

    UdpClient だけのプログラムでうまく動作したので、もしかしてと思い、VB2005で AxWinsock だけの動作

    (同一パソコン内の通信)を作ってみました。

    なんと! 正常に動作しました、VB6での Bind は LocalPort に変更はしましたが、あとはほとんどVB6そのままです。

    このとき、不思議とウイルス検出ソフト(Norton) よりブロックするむねのアラームが出ました。

    (UdpClientの折り返しテストでもでていたのですが)

    それではと思い、ウイルス検出ソフト(Norton)を外し、VB6->VB2005 変換したプログラムを動作させたら、あの

    エラー 10049 は出ず、正常に送受信できました。

    同一パソコン内の通信と外部との通信とでウイルス検出ソフトのアラームの出し方、ブロックのしかたが異なるようです。

    VB6->VB2005 変換したプログラムは外部との通信となっています。

    VB2005 でも AxWinsock はVB6のWinsockと同じ設定にし同じ動作をするはずと思い込んでいたのが

    間違いの様です。

    それにしても、VB6ではウイルス検出ソフトにブロックされず、VB2005の場合ブロックされるのかふしぎなところです。

     

    2007年3月23日 9:40