MSDNヘルプのWinsock (Winsock) コントロールの使い方を
参考にしているんですがサーバー側とクライアント側の接続が
うまくいきません。
クライアント側のソースもどこか変える必要がありますか?
サーバー側Option Explicit
Private intMax As Long
Private Sub Form_Load()
intMax = 0
sckserver(0).LocalPort = 1001
sckserver(0).Listen
tcpclient.Show
End Sub
Private Sub sckServer_ConnectionRequest _
(Index As Integer, ByVal requestID As Long)
If Index = 0 Then
intMax = intMax + 1
Load sckserver(intMax)
sckserver(intMax).LocalPort = 0
sckserver(intMax).Accept requestID
Load txtdata(intMax)
End If
End Sub
Private Sub txtSendData_Change()
sckserver(intMax).SendData TxtSendData.Text
End Sub
Private Sub sckserver_DataArrival(ByVal bytesTotal As Long)
Dim strData As String
sckserver(intMax).GetData strData
TxtOutput.Text = strData
End Sub
クライアント側
Option Explicit
Private Sub Form_Load()
Winsock1.RemoteHost = "RemoteComputerName"
Winsock1.RemotePort = 1001
End Sub
Private Sub cmdConnect_Click()
Winsock1.Connect
End Sub
Private Sub txtSendData_Change()
Winsock1.SendData TxtSend.Text
End Sub
Private Sub tcpClient_DataArrival(ByVal bytesTotal As Long)
Dim strData As String
Winsock1.GetData strData
TxtOutput.Text = strData
End Sub
送受信がうまくいきません。教えてください。
>送受信がうまくいきません。教えてください。
もうすこし具体的にエラーメッセージがでるとか、接続はできるとかないと
わかりにくいですね。
MSDNのヘルプの内容を そのまま 貼り付けても駄目だと思います。
コントロール名とかが微妙に間違っているようですし・・・
Winsock1.RemoteHost = "RemoteComputerName"
↑
このへんも自分の環境に合わせないと接続先が見つからないでしょうね。
サーバー側
Option Explicit
Private intMax As Long
Private Sub Form_Load()
intMax = 0
sckserver(0).LocalPort = 1001
sckserver(0).Listen
tcpclient.Show
End Sub
Private Sub sckServer_ConnectionRequest _
(Index As Integer, ByVal requestID As Long)
If Index = 0 Then
intMax = intMax + 1
Load sckserver(intMax)
sckserver(intMax).LocalPort = 0
sckserver(intMax).Accept requestID
Load txtdata(intMax)
End If
End Sub
Private Sub txtSendData_Change()
sckserver(intMax).SendData TxtSendData.Text
End Sub
Private Sub sckserver_DataArrival(ByVal bytesTotal As Long)
Dim strData As String
sckserver(intMax).GetData strData
TxtOutput.Text = strData
End Sub
クライアント側
Option Explicit
Private Sub Form_Load()
Winsock1.RemoteHost = "RemoteComputerName"
Winsock1.RemotePort = 1001
End Sub
Private Sub cmdConnect_Click()
Winsock1.Connect
End Sub
Private Sub txtSendData_Change()
Winsock1.SendData TxtSendData.Text
End Sub
Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
Dim strData As String
Winsock1.GetData strData
TxtOutput.Text = strData
End Sub
で実行しテキストボックスに入力すると
「実行時エラー40006:指定したトランザクションまたは要求のプロトコルまたは接続状態に問題があります。」
というようなエラーメッセージがでます。
Winsock1.RemoteHost = "RemoteComputerName"
↑
自分の環境に合わせました。
ご意見お聞かせください。
そのクライアント側のコードには、
cmdConnectというコマンドボタンが存在して、
そのボタンのクリック(ソケットの接続処理)をしてから
テキストボックスに何か入力をしていますか?
いきなりテキストボックスに入力しても接続をしていないので、
エラーになります。
#後、ヘルプのコードはとりあえず動く程度しかないので、
#サーバ、クライアントともどもエラー処理や相手側からの切断処理、
#ロードしたコントロール配列の管理等をしなくてはいけません。
batchman さんありがとうございます。
なんとか送受信できるようになりましたが、一度切断して再接続後に
送受信しようとすると、「実行時エラー40006:指定したトランザクション
または要求のプロトコルまたは接続状態に問題があります。」
というようなエラーメッセージがでます。
相手側からの切断処理ができてないんだと思うのですが、どのように
すればいいか、アドバイスをください。
ヘルプでWinsockコントロールのCloseイベントを見て下さい。
片方がクローズされれば、相手側にCloseイベントがきます。
サーバ側アプリケーションを再起動しても、
クライアント側アプリケーションはCloseイベントを受け取って切断されるだけで、
自動で再接続してくれる訳ではありません。
クライアント側でCloseイベントを受け取ったら、
再度接続し直すなりの処理を追加して下さい。
ありがとうございます。
できるようになりました。
もう一つ質問なんですが
Private Sub Command1_Click()
winsock.SendData " 切断しました。"
winsock.Close
End Sub
コマンドボタンをクリックすると、winsock.Close しか
実行されないんですが、どうしてですか?
非同期で動作するコントロールですので、
SendDataメソッド行を抜けたからといって送信が終わっている訳ではありません。
データが正しく送信してから切断処理を行うのであれば、
SendCompleteイベントを受け取ってからクローズ処理をして下さい。
batchman さんありがとうございます。
解決しました。
ツイート | ![]() |