環境 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
よろしくお願いします。
勝手に戻ってしまい?
TextBox1.Text = TextBox1.Text & str
…とかいう話ではないですよね?。
戻るってどういう意味ですか?プログラム上、
何もしないで『勝手に戻る』ことは無いと思うので…
データは取れてきてるんですか?
ブレークを貼りながら確認しているのですが、GetDataする前に、
Dim len As Integer = AxWinsock1.BytesReceived
とすると、ちゃんと53バイト入っているのが確認できます。
その次にGetDataで1行ステップオーバーすると、次の行に
行かずに貼り付けてあるFormに制御が戻ってしまいます。
しばらく放っておくと、TimeOverの文字列を受信するため
DataArrivalが呼び出されます。
テストしているのはPOPサーバーからの受信テストです。
暫く放っておくと、DataArrivalが呼び出されて、その時は
ちゃんとGetDataが出来ます。
-ERR POP timeout from dominion.xxxx.ne.jp
このメッセージを受信したのち、もう一度DataArrivalが
コールバックされて、最初に出たであろう文字列がGetDataで
受信されます。
+OK Pop server at dominion.xxxx.ne.jp signing off.
本来なら、このメッセージを最初に受信するはずなのですが?
何度もすいません。二回目のメッセージは sign off なので
切断されたメッセージですね。
1回目のメッセージが取り出せないのが不明です。
Winsock は使ってないので詳しい方にお任せしますが…、
>その次にGetDataで1行ステップオーバーすると、次の行に
>行かずに貼り付けてあるFormに制御が戻ってしまいます。
はエラーで落ちてるっぽいですね。
過去ログ見ると[VB6.0]ですが Byte 型の配列で取ったりしてます。
String 型への型変換をしようとして落ちてるんじゃないですか?
はい、過去ログは調べまして、
Dim chr(256) As Byte
Dim len As Integer = AxWinsock1.BytesReceived
AxWinsock1.GetData(chr, vbByte, len)
と試しましたがダメでした。元のFormに制御が戻ってしまうんです。
VB.NETとVB6で、socketの違いはあるんでしょうかね?
String周りが怪しいというご指摘で、初期化が必要?と思って
GetDataする前に、str = "" を入れてみたところ正常に動作しました。
VBの場合は、Dim str as Stringの宣言時には初期化されないのでしょうか?
>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 については調べた
ことがありませんので分かりません。