てぃってぃの楽しい副業日記!

ワイと嫁(てぃってぃ)夫婦の、副業(ブログ運営)、プログラミング、育児、ゲーム等を綴ったブログです☆

【VB6】WinsockでTCPクライアントを実装する

実装メモ。VB6(VisualBasic6.0)でWinsockを使ってTCPクライアントを実装する例。
VB.NETの例はたくさんあるけど、VB6は中々見当たらなかったので。
というかいまだにVB6の開発をしているうちの会社って一体…

最大のハマリポイントはDoEventsを呼ばないと送受信が動かないことでした。
一部修正中ですので少々お待ちください。


開発環境/動作環境

  • Windows10
  • VB6

キーワード

  • VB6
  • Winsock
  • State
  • DoEvents

実装内容

1. Winsockコントロールを画面に張りつける

①「プロジェクト」→「コンポーネント」をクリックする VB6TCPクライアント(WinSockの追加方法)

②「Microsoft Winsock Control 6.0」にチェックをいれて「OK」をクリックする VB6TCPクライアント(WinSockの追加方法)

③画面左のツールバーにWinsockコントロールが追加されるので、クリックする VB6TCPクライアント(WinSockの追加方法)

④Winsockコントロールを画面に貼り付けて完成
※ デフォルトのオブジェクト名は「Winsock1」 VB6TCPクライアント(WinSockの追加方法)

2. Winsockコントロールを制御する

フォームは下の構成にし、ボタン押下時に接続、送信、受信、切断する例です。 VB6TCPクライアント(WinSockの追加方法)

Private Sub Command1_Click()

    On Error GoTo TCP_EXIT

    Dim SendData(21) As Byte
    Dim RecvData(128) As Byte
    
    '接続実施
    Winsock1.Close
    Winsock1.Protocol = sckTCPProtocol
    Winsock1.RemoteHost = "127.0.0.1"
    Winsock1.RemotePort = 1001
    Winsock1.Connect

    '接続もしくは切断されるまで待機
    Label1.Caption = "接続中です..."
    Do While (Winsock1.State <> 7)
        DoEvents
        Sleep 100
    Loop
    Label1.Caption = "接続しました"
    
    '電文作成
    SendData(0) = &H12
    SendData(1) = &H34
    SendData(2) = &H56
    
    '電文送信
    Label1.Caption = "送信中です..."
    Call Winsock1.SendData(SendData)
    DoEvents
    
    '送信結果確認
    If Winsock1.State = 9 Then
        Label1.Caption = "送信に失敗しました"
    End If
    Label1.Caption = "送信しました"

    '電文受信
    Label1.Caption = "受信中です..."
    Call Winsock1.GetData(RecvData, vbArray + vbByte, 128)
    DoEvents
        
    '受信結果確認
    Text1.Text = RecvData
    
    
TCP_EXIT:
    '終了処理
    Label1.Caption = "切断中です..."
    Winsock1.Close
    Label1.Caption = "切断しました"
    

End Sub



補足(Winsock.State)

WinsockのStateが持つ意味について、下表にまとめました。

名称 状態
0sckClosedソケットがクローズしている
1sckOpenソケットがオープンしている
2sckListeningソケットが接続要求を待っている
3sckConnectionPending接続がペンディング状態になっている
4sckResolvingHostホストの解決処理中
5sckHostResolvedホストの解決完了
6sckConnecting接続処理中
7sckConnected接続完了
8sckClosingソケットをクローズ中
9sckErrorエラー

ちなみに、状態2(sckListening)はサーバー固有?クライアントはリッスンしないので。
また、「ホストの解決処理」とは、恐らくDNSの名前解決のことでしょう(宛先を「google.com」と書いたらその名前をDNSサーバに問い合わせて、具体的なIPアドレスに変換する手続きのこと)。
エラー(9)が返ってきた場合は、プログラムの実装ミスの可能性大。引数の指定やお作法に問題がないか見直そう。

普通にネットワークが繋がる環境であれば問題ないが、そうでない場合等はStateの状態からネットワークの課題を解決する必要がある。


以上。間違いあれば受け付けます。