WinSockのGetData

解決


加藤  2004-06-25 00:56:38  No: 114290  IP: [192.*.*.*]

環境 VB.NET 2003

VB初心者のVC++プログラマです。
SocketをConnectして、"+OK ..."というメッセージを受信しようとして
DataArrivalが呼び出されるのですが、GetDataから次の処理に行かずに
勝手に戻ってしまい文字列が取り出せません。
GetData(str, vbString)しても同様です。

どこが間違っているのでしょうか?

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        AxWinsock1.Connect(strServ, 110)
    End Sub

    Private Sub AxWinsock1_DataArrival(ByVal sender As Object, ByVal e As AxMSWinsockLib.DMSWinsockControlEvents_DataArrivalEvent) Handles AxWinsock1.DataArrival
        Dim str As String

        AxWinsock1.GetData(str)
        TextBox1.Text = str
    End Sub

よろしくお願いします。

編集 削除
特攻隊長まるるう  2004-06-25 09:13:27  No: 114291  IP: [192.*.*.*]

勝手に戻ってしまい?
 TextBox1.Text = TextBox1.Text & str
…とかいう話ではないですよね?。
戻るってどういう意味ですか?プログラム上、
何もしないで『勝手に戻る』ことは無いと思うので…
データは取れてきてるんですか?

編集 削除
加藤  2004-06-25 10:07:10  No: 114292  IP: [192.*.*.*]

ブレークを貼りながら確認しているのですが、GetDataする前に、
    Dim len As Integer = AxWinsock1.BytesReceived
とすると、ちゃんと53バイト入っているのが確認できます。

その次にGetDataで1行ステップオーバーすると、次の行に
行かずに貼り付けてあるFormに制御が戻ってしまいます。

しばらく放っておくと、TimeOverの文字列を受信するため
DataArrivalが呼び出されます。
テストしているのはPOPサーバーからの受信テストです。

編集 削除
加藤  2004-06-25 10:24:22  No: 114293  IP: [192.*.*.*]

暫く放っておくと、DataArrivalが呼び出されて、その時は
ちゃんとGetDataが出来ます。

    -ERR POP timeout from dominion.xxxx.ne.jp

このメッセージを受信したのち、もう一度DataArrivalが
コールバックされて、最初に出たであろう文字列がGetDataで
受信されます。

    +OK Pop server at dominion.xxxx.ne.jp signing off.

本来なら、このメッセージを最初に受信するはずなのですが?

編集 削除
加藤  2004-06-25 10:25:30  No: 114294  IP: [192.*.*.*]

何度もすいません。二回目のメッセージは sign off なので
切断されたメッセージですね。

1回目のメッセージが取り出せないのが不明です。

編集 削除
特攻隊長まるるう  2004-06-25 10:31:32  No: 114295  IP: [192.*.*.*]

Winsock は使ってないので詳しい方にお任せしますが…、
>その次にGetDataで1行ステップオーバーすると、次の行に
>行かずに貼り付けてあるFormに制御が戻ってしまいます。
はエラーで落ちてるっぽいですね。
過去ログ見ると[VB6.0]ですが Byte 型の配列で取ったりしてます。
String 型への型変換をしようとして落ちてるんじゃないですか?

編集 削除
加藤  2004-06-25 10:46:55  No: 114296  IP: [192.*.*.*]

はい、過去ログは調べまして、

       Dim chr(256) As Byte
       Dim len As Integer = AxWinsock1.BytesReceived
       AxWinsock1.GetData(chr, vbByte, len)

と試しましたがダメでした。元のFormに制御が戻ってしまうんです。
VB.NETとVB6で、socketの違いはあるんでしょうかね?

編集 削除
加藤  2004-06-25 10:55:58  No: 114297  IP: [192.*.*.*]

String周りが怪しいというご指摘で、初期化が必要?と思って
GetDataする前に、str = "" を入れてみたところ正常に動作しました。

VBの場合は、Dim str as Stringの宣言時には初期化されないのでしょうか?

編集 削除
特攻隊長まるるう  2004-06-25 14:22:13  No: 114298  IP: [192.*.*.*]

>VBの場合は、Dim str as Stringの宣言時には初期化されないのでしょうか?
そんなことは無いと思います。例えば
        Dim str As String
        TextBox1.Text = str
では正常に動きますので。

ただ、実際は違う動きをしている。むむー(悩)。…以前に
[バイト配列の値を文字列に変換するには?]
http://madia.world.coocan.jp/cgi-bin/VBBBS2/wwwlng.cgi?print+200404/04040020.txt
で、
   str = "aaa・
という『"』で閉じられていない状態になってしまった文字列に
   str = str & "bbb"
としても連結できないという事はありました。ちょっと無理の
ある解釈ですが、
   str = "" 
しない状態がこんな壊れた状態で、Winsock の内部処理が
文字列連結に近いものなら不具合が起きる可能性はあるかも
しれません。…しかしなにぶん Winsock については調べた
ことがありませんので分かりません。

編集 削除