TCP接続の2 つ以上の接続要求の受け付けをするには?

解決


素人志向  2004-01-09 22:25:51  No: 111176

MSDNヘルプのWinsock (Winsock) コントロールの使い方を
参考にしているんですがサーバー側とクライアント側の接続が
うまくいきません。
クライアント側のソースもどこか変える必要がありますか?


素人志向  2004-01-09 23:24:34  No: 111177

サーバー側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

送受信がうまくいきません。教えてください。


ゴゴ  2004-01-11 01:12:34  No: 111178

>送受信がうまくいきません。教えてください。
もうすこし具体的にエラーメッセージがでるとか、接続はできるとかないと
わかりにくいですね。
MSDNのヘルプの内容を そのまま 貼り付けても駄目だと思います。
コントロール名とかが微妙に間違っているようですし・・・
                        
Winsock1.RemoteHost = "RemoteComputerName"  
                              ↑
このへんも自分の環境に合わせないと接続先が見つからないでしょうね。


素人志向  2004-01-13 18:51:48  No: 111179

サーバー側
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"  
                              ↑
                  自分の環境に合わせました。

ご意見お聞かせください。


batchman  2004-01-13 23:05:56  No: 111180

そのクライアント側のコードには、
cmdConnectというコマンドボタンが存在して、
そのボタンのクリック(ソケットの接続処理)をしてから
テキストボックスに何か入力をしていますか?

いきなりテキストボックスに入力しても接続をしていないので、
エラーになります。

#後、ヘルプのコードはとりあえず動く程度しかないので、
#サーバ、クライアントともどもエラー処理や相手側からの切断処理、
#ロードしたコントロール配列の管理等をしなくてはいけません。


素人志向  2004-01-14 18:13:50  No: 111181

batchman さんありがとうございます。
なんとか送受信できるようになりましたが、一度切断して再接続後に
送受信しようとすると、「実行時エラー40006:指定したトランザクション
または要求のプロトコルまたは接続状態に問題があります。」
というようなエラーメッセージがでます。
相手側からの切断処理ができてないんだと思うのですが、どのように
すればいいか、アドバイスをください。


batchman  2004-01-14 19:33:44  No: 111182

ヘルプでWinsockコントロールのCloseイベントを見て下さい。
片方がクローズされれば、相手側にCloseイベントがきます。

サーバ側アプリケーションを再起動しても、
クライアント側アプリケーションはCloseイベントを受け取って切断されるだけで、
自動で再接続してくれる訳ではありません。
クライアント側でCloseイベントを受け取ったら、
再度接続し直すなりの処理を追加して下さい。


素人志向  2004-01-14 20:29:52  No: 111183

ありがとうございます。
できるようになりました。
もう一つ質問なんですが

Private Sub Command1_Click()
    winsock.SendData " 切断しました。"
    winsock.Close
End Sub
コマンドボタンをクリックすると、winsock.Close  しか
実行されないんですが、どうしてですか?


batchman  2004-01-15 09:31:59  No: 111184

非同期で動作するコントロールですので、
SendDataメソッド行を抜けたからといって送信が終わっている訳ではありません。

データが正しく送信してから切断処理を行うのであれば、
SendCompleteイベントを受け取ってからクローズ処理をして下さい。


素人志向  2004-01-16 01:57:05  No: 111185

batchman さんありがとうございます。
解決しました。


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

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






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