Winsockコントロールの送信と受信


おはぎ  2003-03-04 01:39:49  No: 77288

こんにちは。
WinSockコントロールを使って1つのPCで2つのプログラム間でソケットの送受信をしています。
クライアントがサーバーにメッセージを送ったら、サーバーは成功OR失敗をクライアントに返信するのですが、クライアントが返信を受け取らず、困っています。(DataArrivalイベントが発生しない)
クライアントはSendDataの後、エラーが発生していないので、送ってはいるのですが。


takk  2003-03-04 02:19:44  No: 77289

ソケットはちょっと苦手なんですが…。
SendDataの直後にCloseしたりしてませんか?
サーバー側のSendCompleteイベントでCloseしないとデータを送信できないことがあります。

あとはソケットまわりのソースを見ないと僕には分からないです(クライアントもサーバーも)


おはぎ  2003-03-04 02:48:07  No: 77290

レスありがとうございます。
以下がコードです。

<クライアントが送信>
lc_strDelMsg = "Image_Delete -1" & vbCrLf

     With frmMain.tcpClient
          .SendData lc_strDelMsg
     End With

<サーバーが受信>
Private Sub SockTcpServer_DataArrival(Index As Integer, ByVal requestID As Long)
' 受信データ用の変数を宣言します。
' GetData メソッドを呼び出し、txtOutput という名前のテキストボックスの Textプロパティに
' そのデータを設定します。

Dim strData As String
Dim fchk As Boolean
Dim I As Integer

    On Error Resume Next
    
    SockTcpServer(gb_ServerAceptMax).GetData strData
    
    ' 2003/02/14
    ' リストボックスに受信メッセージを表示
    Call WriteLstBox(strData)

    Call GB_WriteLog("クライアントからの受信 " & strData)
    
    If Err.number <> 0 Then
        lc_ErrNo = Err.number
        lc_ErrMsg = "SockTcpServer_DataArrival: 受信エラー, ErrNo = "                         & CStr(lc_ErrNo)
        Call GB_WriteLog(lc_ErrMsg)
        fchk = SetLastError(5)
        
        Err.Clear
        Exit Sub
    End If
    
    ' 受信中フラグ = ON
    gb_RcvFlg = True
    
    Call gb_SockCommunication(strData)  ’ここで、返信準備に入る
    
    fchk = True

End Sub
<サーバーが返信>
Public Function SendClientMsg(intType As String) As Boolean

Dim strSendMsg As String
Dim fchk As Boolean
    
    SendClientMsg = True
    
    strSendMsg = ""
        
    On Error Resume Next            ' エラーのトラップを留保します。                                                      
    
    Select Case intType
        Case 1:     ' 1 : 成功
            strSendMsg = "1"
        Case 0:     ' 0 : 失敗
            strSendMsg = "0"
        Case -1:     ' -1 : 手動操作中
            strSendMsg = "-1"
        Case Else:
            strSendMsg = "0"
    End Select
    strSendMsg = strSendMsg & vbCrLf
  
            With frmMain
              .SockTcpServer(gb_ServerAceptMax).SendData strSendMsg
              .txtRcv.Text = strSendMsg
            
              DoEvents
            
              Call GB_PrintLog("SendClientMsg 返信 : " & strSendMsg)
              Call GB_WriteLog("SendClientMsg 返信 : " & strSendMsg)
            End With
            
End Function

・・・こんなかんじです。長くてすみません。
サーバー側のSendCompleteイベントの処理を入れると、10093番の”まず WinsockInit を呼び出す必要があります。”というエラーがでます。
サーバーからの返信がないと、返信待ちループから抜けれず、次のソケットが送信できません。


takk  2003-03-04 03:54:01  No: 77291

正直言うと全然分かりませんでした、スミマセン…。

> サーバー側のSendCompleteイベントの処理を入れると、
> 10093番の”まず WinsockInit を呼び出す必要があります。”というエラーがでます。

このエラーも全く見たことがありません。
ちなみにSendCompleteイベントでどのような処理をしようとしたのでしょうか?


おはぎ  2003-03-04 18:44:40  No: 77292

SendCompleteイベントでは、takkさんのおっしゃる通り、ソケットをCloseしようとしました。


takk  2003-03-05 01:27:10  No: 77293

すいません、やっぱり分からなかったです。
ただ僕は普通に使っていてそのような状況になったことは一度も無いので
何か見落としているのかもしれません。

お役に立てなくてすみませんm(_ _)m


おはぎ  2003-03-05 18:52:41  No: 77294

もう一度見落としがないか、確かめてみます。
ありがとうございました。


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

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






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