こんにちは。
WinSockコントロールを使って1つのPCで2つのプログラム間でソケットの送受信をしています。
クライアントがサーバーにメッセージを送ったら、サーバーは成功OR失敗をクライアントに返信するのですが、クライアントが返信を受け取らず、困っています。(DataArrivalイベントが発生しない)
クライアントはSendDataの後、エラーが発生していないので、送ってはいるのですが。
ソケットはちょっと苦手なんですが…。
SendDataの直後にCloseしたりしてませんか?
サーバー側のSendCompleteイベントでCloseしないとデータを送信できないことがあります。
あとはソケットまわりのソースを見ないと僕には分からないです(クライアントもサーバーも)
レスありがとうございます。
以下がコードです。
<クライアントが送信>
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 を呼び出す必要があります。”というエラーがでます。
サーバーからの返信がないと、返信待ちループから抜けれず、次のソケットが送信できません。
正直言うと全然分かりませんでした、スミマセン…。
> サーバー側のSendCompleteイベントの処理を入れると、
> 10093番の”まず WinsockInit を呼び出す必要があります。”というエラーがでます。
このエラーも全く見たことがありません。
ちなみにSendCompleteイベントでどのような処理をしようとしたのでしょうか?
SendCompleteイベントでは、takkさんのおっしゃる通り、ソケットをCloseしようとしました。
すいません、やっぱり分からなかったです。
ただ僕は普通に使っていてそのような状況になったことは一度も無いので
何か見落としているのかもしれません。
お役に立てなくてすみませんm(_ _)m
もう一度見落としがないか、確かめてみます。
ありがとうございました。
ツイート | ![]() |