tagCANDY CGI VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板 [ツリー表示へ]   [Home]
一括表示(VB6.0)
タイトルWinsockを用いた双方向ソケット通信について
記事No11658
投稿日: 2008/03/05(Wed) 15:28
投稿者ダリア
いつもお世話になります。ダリアです。
初歩的なことかもしれませんが是非にアドバイスをお願いしたく思います。
Winsockを用いたソケット通信についてです。
環境はWinXP、VB6を使用しています。

目的はA側とB側での双方向でのソケット通信です。ポートは二つ用意します。
(A、Bはそれぞれ単独のEXEです。動作を確認したいので現在はA,Bがほぼ同じプログラムで、ポート指定のみ逆にしています。A側ではwskTcpClient(0).LocalPort = "2222"、wskTcpInter.RemotePort = "1111")
A側の接続ボタンをクリックの後B側の接続ボタンをクリックすると、B側の送信は可能。A側は不可。
B側の接続ボタンをクリックの後A側の接続ボタンをクリックすると、A側の送信は可能。B側は不可。
タイミングのせいなのか、と思ったりもするのですが。

エラーメッセージは送信ボタンクリック後のwskTcpInter_State(関数)にてSTATEを表示させています。”ホストの解決処理中です”とメッセージが出ます。
接続されていないのだろうとは思うのですが、これを回避する方法が分かりません。
申し訳ありませんが、よろしくお願いします。


MSDNのプログラムを参考にサーバ側(B側)のプログラムを以下のように作りました。
'接続ボタンをクリック
Private Sub command1_click()
On Error GoTo err_end:
    wskTcpClient(0).Close
'ポート番号を指定して相手アプリからの接続要求を待つ
    wskTcpClient(0).LocalPort = "1111"
    wskTcpClient(0).Listen
    
    wskTcpInter.Close
    wskTcpInter.Protocol = sckTCPProtocol
    wskTcpInter.LocalPort = 0
    wskTcpInter.RemoteHost = "localhost"
    wskTcpInter.RemotePort = "2222"
    wskTcpInter.Connect
    
    Exit Sub
    
err_end:
    MsgBox (wskTcpClient(0).State)
    
End Sub


'送信ボタンクリック
Private Sub command4_click()
    
If wskTcpInter.State <> 7 Then
        wskTcpInter.Close
        wskTcpInter.Connect
        wskTcpInter_State
Else
        wskTcpInter.SendData "TestData"
End If
End Sub

Private Sub wskTcpInter_DataArrival(ByVal bytesTotal As Long)
    Dim strBuf As String
    wskTcpInter.GetData strBuf
    Text2.Text = strBuf
End Sub


Private Sub wskTcpClient_ConnectionRequest(Index As Integer, ByVal requestID As Long)
If wskTcpClient(intConnectMax).State <> sckClosed Then
        wskTcpClient(intConnectMax).Close
End If
'相手アプリからの接続要求を受け付ける
    intConnectMax = intConnectMax + 1
    wskTcpClient(intConnectMax).Accept requestID
    
End Sub

Private Sub wskTcpClient_DataArrival(Index As Integer, ByVal bytesTotal As Long)
'データが届く
    Dim strBuf As String    
'相手アプリの送信データを取得する
    wskTcpClient(Index).GetData strBuf
    Text1.Text = "メインから「" & strBuf & "」を受信しました。"
'相手アプリにデータを返信する
    wskTcpClient(Index).SendData StrConv(strBuf, vbWide)
End Sub

[ツリー表示へ]
タイトルRe: Winsockを用いた双方向ソケット通信について
記事No11664
投稿日: 2008/03/05(Wed) 17:44
投稿者ダリア
ダリアです。
投稿後にプログラムをいじってみたのですが。
B側の送信ボタンクリックを以下のように変えて、B側の接続ボタンをクリックの後A側の接続ボタンをクリックすると一応はA側B側で希望通りの動きをしているように見えます。
ただ、こういう方法が良いのかどうかは疑問なのですが。いかがでしょうか?

'送信ボタンクリック
Private Sub command4_click()
    Dim i As Integer
    i = 0
If wskTcpInter.State <> 7 Then
Do
        wskTcpInter.Close
        wskTcpInter.Connect
        i = i + 1
        If i >= 100 Then
            MsgBox "i>100のため、処理を終了します"
            Exit Do
        End If
        DoEvents
        If wskTcpInter.State = 7 Then
            Exit Do
        End If
Loop
        wskTcpInter.SendData "TestData"
Else
        wskTcpInter.SendData "TestData"
End If
End Sub

[ツリー表示へ]
タイトルRe: Winsockを用いた双方向ソケット通信について
記事No11667
投稿日: 2008/03/05(Wed) 21:21
投稿者Starfish

> エラーメッセージは送信ボタンクリック後のwskTcpInter_State(関数)にてSTATEを表示させています。”ホストの解決処理中です”とメッセージが出ます。
> 接続されていないのだろうとは思うのですが、これを回避する方法が分かりません。
> 申し訳ありませんが、よろしくお願いします。

 Connectを発行する前に、サーバ側でListenを発行している必要があります。
 ListenをFormのLoadイベントに持っていって、両方のプログラムを起動した後で
接続ボタンを押せば両方とも接続できると思います。

[ツリー表示へ]
タイトルRe^2: Winsockを用いた双方向ソケット通信について
記事No11674
投稿日: 2008/03/06(Thu) 11:42
投稿者ダリア
お返事ありがとうございます、Starfishさま。

>  Connectを発行する前に、サーバ側でListenを発行している必要があります。
>  ListenをFormのLoadイベントに持っていって、両方のプログラムを起動した後で
> 接続ボタンを押せば両方とも接続できると思います。

おかげさまで奇妙なループを入れることなく送受信ができました。
同じところでぐるぐる悩んでいたので本当にありがとうございます。

ひとつ、疑問なのですが。
Listenで受信/Connectで送信と明確に決まっているものなのでしょうか?
ソケット通信が繋がっているならば、どちらが送信側でも受信側でも構わないような気がするのです。
(送受信を混在したいわけではありません。)
たとえば、サーバ側はListenを2ポート、クライアント側が2ポートConnectさせて、サーバ側からメッセージを送るということは手法的にいかがでしょうか?
例題ではListenで受信/Connectで送信と使っていたので、上記のような使い方に問題があるのかないのかが判断が付かないのです。
申し訳ありませんが、よろしくお願いいたします。

[ツリー表示へ]
タイトルRe^3: Winsockを用いた双方向ソケット通信について
記事No11697
投稿日: 2008/03/07(Fri) 00:47
投稿者Starfish
> ひとつ、疑問なのですが。
> Listenで受信/Connectで送信と明確に決まっているものなのでしょうか?
> ソケット通信が繋がっているならば、どちらが送信側でも受信側でも構わないような気がするのです。
> (送受信を混在したいわけではありません。)
> たとえば、サーバ側はListenを2ポート、クライアント側が2ポートConnectさせて、サーバ側からメッセージを送るということは手法的にいかがでしょうか?
> 例題ではListenで受信/Connectで送信と使っていたので、上記のような使い方に問題があるのかないのかが判断が付かないのです。
> 申し訳ありませんが、よろしくお願いいたします。

 複雑なシステムでいたら、複数のコネクションを張って行うこともありますが、
簡単なものでしたらふつうは1本のみコネクションを張って、それを使用して
送受信します。

[ツリー表示へ]
タイトルありがとうございます
記事No11701
投稿日: 2008/03/07(Fri) 09:57
投稿者ダリア
Starfishさま、お返事ありがとうございます。

>
>  複雑なシステムでいたら、複数のコネクションを張って行うこともありますが、
> 簡単なものでしたらふつうは1本のみコネクションを張って、それを使用して
> 送受信します。

なるほど。それで、例題ではポートが1つの場合だけなのですね。
ご回答、ありがとうございました。

[ツリー表示へ]