|
WILLはネットワークに関するあらゆるソリューションをご提供します。
|
|
株式会社ウィル |
|
'(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. |