'CHATSRV 1.1 (C)COPYRIGHT 1997 WILL
Option Explicit
'List1にログメッセージを追加する
Private Sub addlog(msg$)
List1.AddItem msg 'メッセージを追加する
List1.ListIndex = List1.NewIndex '追加した行をハイライトにする
If (List1.ListCount > 100) Then '100行を超えるときは
List1.RemoveItem 0 '先頭から削除してゆく
End If
End Sub
'開始ボタン
Private Sub Command1_Click()
Command1.Enabled = False '開始ボタンを押せないようにする
Command2.Enabled = True '中断ボタンは有効
Tcpip1.Listen "2000" 'ポート2000で接続を待つ
addlog "START" 'ログに開始したことを記録する
End Sub
'中断ボタン
Private Sub Command2_Click()
Tcpip1.Close '待ちポートを閉じる。Closedイベントがあがる
End Sub
'終了ボタン
Private Sub Command3_Click()
Dim tcp As Object '接続中のオブジェクト
Tcpip1.Close 'まず待ちポートを閉じる
For Each tcp In Tcpip2 '接続中のオブジェクトを取り出し
tcp.Close '接続を閉じてから
Next
End '終了する
End Sub
'著作権表示
Private Sub Form_Load()
Label2 = Tcpip1.copyright '使用しているTCPIPOCXの著作権を表示する
End Sub
'フォームの大きさに応じてログエリアの大きさを調整する
Private Sub Form_Resize()
Dim w%, h% 'ログエリアの幅と高さ
List1.Left = 0 '左端にピタットつける
w = Me.ScaleWidth '幅はフォームの幅と同じ
h = Me.ScaleHeight - List1.Top '高さを調節してフォームの下弦にピタットつける
If (w > 0 And h > 0) Then '表示できない大きさでない限り
List1.Width = w '幅と
List1.Height = h '高さを変更する
End If
End Sub
'接続要求が来た
Private Sub Tcpip1_Accepting(ByVal NewSocket As Long, ByVal RemoteIp As Long, ByVal RemotePort As Integer, CancelAccept As Boolean)
Load Tcpip2(NewSocket) '通信のためのソケットオブジェクトを用意して
Tcpip2(NewSocket).Accept NewSocket '新たに接続を開始する
Tcpip3.InetIp = RemoteIp '相手のアドレスをドット表記して
Tcpip3.StopRequest '検索する必要はない
Tcpip2(NewSocket).UserData1 = Tcpip3.InetAddress & ":" & RemotePort '記憶する
addlog "ENTER " & NewSocket & ":" & Tcpip3.InetAddress & ":" & RemotePort
End Sub
'接続が切れた。新たな接続はない
Private Sub Tcpip1_Closed()
Command1.Enabled = True
Command2.Enabled = False
addlog "STOP"
End Sub
'通信エラーが発生した
Private Sub Tcpip1_WsError(ByVal Ecode As Long, ByVal Description As String, ByVal Where As String, CancelClose As Boolean)
MsgBox Description & "(" & Ecode & ")", vbExclamation, "Tcpip1_WsError"
End Sub
'個々の通信が切れた
Private Sub Tcpip2_Closed(Index As Integer)
Unload Tcpip2(Index) 'オブジェクトをメモリから削除する
addlog "LEAVE " & Index
End Sub
'Acceptメソッドの結果接続した
Private Sub Tcpip2_Connected(Index As Integer)
Tcpip2(Index).Tag = "" '送信待ちのデータ
Tcpip2(Index).UserData2 = "" 'ユーザーの名前
End Sub
'データを受信した
Private Sub Tcpip2_Received(Index As Integer, data As String)
Dim x$, w$, tcp As Object
x = StrConv(data, vbUnicode) 'ANSI/DBCSからUnicodeに変換
Tcpip2(Index).UserData2 = x '送信者の名前を記憶する
addlog "RECV " & Index & ":" & x
If (InStr(x, "#who#") > 0) Then '接続中のユーザーリストを要求しているので
w = "接続中のユーザーリスト" & vbCrLf
For Each tcp In Tcpip2 '接続中のオブジェクトを取り出し
If (tcp.Index <> 0) Then 'ダミーを無視する
w = w & "[" & tcp.UserData1 & "]" & tcp.UserData2
End If
Next
w = StrConv(w, vbFromUnicode) 'UnicodeをANSI/DBCSに変換して
If (Tcpip2(Index).Sendable = True) Then '送信可能なら
Tcpip2(Index).Send w 'そのまま送り
Else '無理なら
Tcpip2(Index).Tag = Tcpip2(Index).Tag & w '保留して送信可能になったら
End If '(Sentイベント)で送信する
Else '受信したデータを全員にブロードキャストする
For Each tcp In Tcpip2 '接続中のオブジェクトを取り出し、
If (tcp.Index <> 0) Then 'ダミーを無視する
If (tcp.Sendable = True) Then '送信可能なら
tcp.Send data 'そのまま送り
Else '無理なら
tcp.Tag = tcp.Tag & data '保留して送信可能になったら
End If '(Sentイベント)で送信する
End If
Next
End If
End Sub
'送信可能になった
Private Sub Tcpip2_Sent(Index As Integer)
Dim x$
If (Tcpip2(Index).Tag <> "") Then '保留されているデータがあるなら
x = Tcpip2(Index).Tag '文字列変数に移して
Tcpip2(Index).Tag = "" '保留を解除したうえで
Tcpip2(Index).Send x '送信する
End If
End Sub
'通信エラーが発生した
Private Sub Tcpip2_WsError(Index As Integer, ByVal Ecode As Long, ByVal Description As String, ByVal Where As String, CancelClose As Boolean)
MsgBox Description & "(" & Ecode & ")", vbExclamation, "Tcpip2_WsError"
End Sub
|