WILLはネットワークに関するあらゆるソリューションをご提供します。
株式会社ウィル

HOME 新着情報 製品一覧 受託開発 Download 購入方法 トライアル サポート 会社案内

ECHOサーバーサンプル ECHOSRV Ver1.2

▼概要  ▼プログラミング概要  ▼ソースコード  プログラムのダウンロード→

概 要

ECHO SERVERは、ポート7で接続を待ちます。接続要求が来ると、サーバーは接続を許可し、その後送信されてくる文字列をそのまま送信します。

▲TOPへ

プログラミング概要

ECHO SERVER プログラムは下記の手順で通信を行います。
  1. 2つのTCPIPコントロールを用意します。1つを受付用に、もう一つを通 信用にします。通信用コントロールは、コントロール配列にします。
  2. コマンドボタンが押されたとき 受付用コントロールのListen メソッドを用いて接続受付を開始します。
  3. 接続要求が来たらAcceptingイベントが発生します。通 信用コントロールを新しく用意して、そのAcceptメソッドを用いて接続を受け入れます。
  4. 通 信用コントロールのRecieved イベントで受信したデータをそのまま送信します。
  5. 通 信用コントロールのClosed イベントで対象となる通信用コントロールを破棄します。

▲TOPへ

ソースコード

'(C)COPYRIGHT 1997 WILL
Option Explicit
'開始ボタン
Private Sub Command1_Click()
    'エコーサーバー開始
    'Listen中にListenメソッドを起動しないようにする
    Command1.Enabled = False
    '中止はいつでも可能
    Command2.Enabled = True
    '既にListenしているとエラーになる。エラーに備える
    On Error GoTo err1
    'エコーサーバーのポート番号は7Tcpip1.Listen "7"
    On Error GoTo 0
    Exit Sub

err1:
    'エラーの内容を表示する。NumberにWinsockのエラー番号が入っている
    MsgBox Err.Description & "(" & Err.Number & ")", vbExclamation, "Listen"
    '検索ボタンを有効にする
    Command1.Enabled = True
    Command2.Enabled = False
End Sub
'中断ボタン
Private Sub Command2_Click()
    'エコーサーバーの受付を中断する
    '通信中のものはそのまま継続
    Tcpip1.Close
End Sub
'終了ボタン
Private Sub Command3_Click()
    'サーバーなのできちんと終わってあげる
    '通信中のtcpip2オブジェクト
    Dim t As Tcpip
    
    'クライアントからの受付を終了する
    Tcpip1.Close
    'Tcpip2のオブジェクトのコレクションから通信中のオブジェクトを
    '一つづつ取り出す
    For Each t In Tcpip2
        '名前解決中の場合、それを中断する
        Tcpip3(t.Index).StopRequest
        '通信を終了する。Closedイベントでオブジェクトのunloadを行う
        t.Close
    Next
    End
End Sub

Private Sub Form_Load()
    'TCPIP.OCXの著作権表示を行ってください
    Label2 = Tcpip1.copyright
End Sub
'接続要求が来た
Private Sub Tcpip1_Accepting(ByVal NewSocket As Long, ByVal RemoteIp As Long, ByVal RemotePort As Integer,
CancelAccept As Boolean) '接続要求がきた 'NewSocketは通信ごとにユニークなのでこれで通信オブジェクトを識別する If (NewSocket <> 0) Then 'Tcpip2(0)はロード済み Load Tcpip2(NewSocket) Load Tcpip3(NewSocket) End If '接続要求を受け入れる。Tcpip2(Newsocket)でConnectイベントが発生する Tcpip2(NewSocket).Accept NewSocket End Sub '接続待ちのソケットが閉じられた Private Sub Tcpip1_Closed() Command1.Enabled = True Command2.Enabled = False End Sub '通信が終了した Private Sub Tcpip2_Closed(Index As Integer) Call log(Index, "Closed") '記録を残す If (Index <> 0) Then 'Tcpip2(0),Tcpip3(0)以外のオブジェクトをunloadする 'unloadしないと、Accepting時のloadステートメントでload済みの 'オブジェクトをloadしようとしてエラーになる Unload Tcpip2(Index) Unload Tcpip3(Index) End If End Sub '通信を開始した Private Sub Tcpip2_Connected(Index As Integer) '通信相手を表示する。InetIpに入れるとInetAddressにドットアドレスが返る '同時に非同期検索で、ホスト名の解決をしているのでResolvedイベントがあがる 'ConnectしているオブジェクトTcpip2()を用いて、名前解決を行うとその後の 'Sendが行えなくなるので注意する Tcpip3(Index).InetIp = Tcpip2(Index).RemoteIp Call log(Index, "Connected " & Tcpip3(Index).InetAddress & ":" & _ Tcpip2(Index).RemotePort) '記録を残す End Sub 'データを受信した Private Sub Tcpip2_Received(Index As Integer, data As String) 'dataをそのまま返す Call log(Index, "Received " & LenB(data) & " bytes") '記録を残す If (Tcpip2(Index).Sendable = True) Then '送信可能なら送信し、 Tcpip2(Index).Send data Else '不可能なら可能になるの(Sentイベント)を待つ Tcpip2(Index).Tag = Tcpip2(Index).Tag & data 'Tagはコード変換しない End If End Sub '送信可能になった。 Private Sub Tcpip2_Sent(Index As Integer) Dim d$ If (Tcpip2(Index).Tag <> "") Then '送信待ちのデータがあれば、 d = Tcpip2(Index).Tag Tcpip2(Index).Tag = "" '待ち状態を解除した上で Tcpip2(Index).Send d '送信する End If End Sub 'Winsockの非同期処理中のエラー Private Sub Tcpip2_WsError(Index As Integer, ByVal Ecode As Long, ByVal Description As String, ByVal Where As String,
CancelClose As Boolean) Call log(Index, "WsError " & Description & "(" & Ecode & ")") End Sub 'IPアドレスから名前を検索した Private Sub Tcpip3_Resolved(Index As Integer, ByVal Ip As Long, ByVal Name As String, ByVal Address As String) 'Connectedイベント中に指示したホスト名の検索が完了した If (Ip = -1) Then Call log(Index, "Resolved ホスト名は判りません。") Else Call log(Index, "Resolved " & Address & "->" & Name) End If End Sub '記録を残す Private Sub log(Index As Integer, msg As String) '先頭に通信オブジェクトの識別番号を表示。 List1.AddItem Format(Index, "000 ") & msg '最新のデータにフォーカス List1.ListIndex = List1.NewIndex End Sub

(C) Copyright 2003 WILL Corporation. All rights reserved.