Gateway는 Server와 Client에 사이에서 연결을 중계해주는 역할을 한다. 따라서 Client의 입장에서 볼 때는 Server가, Server의 입장에서 볼 때는 Client가 되는 것이라 보면 된다. 즉 그 소스코드도 동일하다는 이야기이다.
단 Socket을 두 개를 써야하는 점이 다르며 Client에서 Connection요청이 들어오면 Accept를 함과 동시에 Server에 Connect를 해야 한다. 그 다음은 일반적으로 생각하듯이 중계자 역할을 충실히 하기만 하면 된다.
다중 연결을 고려하려면 Index를 사용하여 복수개의 연결을 가능하도록 해야 한다.
Option Explicit
Dim ConnID() As Long
Dim ConnIndex As Integer
Dim readl As String
Dim rHost, rPort, lPort As String
Const FileSpec = "D:\Projects\VBs\SystemInfo.dat"
Private Sub Form_Load()
Dim FSO As FileSystemObject
Dim ts As TextStream
On Error Resume Next
Set FSO = New FileSystemObject
Set ts = FSO.OpenTextFile(FileSpec, ForReading)
If Err.Number = 0 Then
Do While (ts.AtEndOfStream = False)
readl = ts.ReadLine
If InStr(readl, "[RemoteHost]") Then
readl = ts.ReadLine
rHost = readl
End If
If InStr(readl, "[RemotePort]") Then
readl = ts.ReadLine
rPort = readl
End If
If InStr(readl, "[LocalPort]") Then
readl = ts.ReadLine
lPort = readl
End If
Loop
End If
On Error GoTo 0
If Trim(rHost) = "" Then
rHost = "127.0.0.1"
End If
If Trim(rPort) = "" Then
rPort = "9000"
End If
If Trim(lPort) = "" Then
lPort = "2000"
End If
Set ts = Nothing
Set FSO = Nothing
ConnIndex = 0
Winsock1(ConnIndex).Protocol = sckTCPProtocol
Winsock1(ConnIndex).LocalPort = CLng(lPort)
Winsock1(ConnIndex).Listen
Winsock2(ConnIndex).Protocol = sckTCPProtocol
Winsock2(ConnIndex).RemoteHost = rHost
Winsock2(ConnIndex).RemotePort = CLng(rPort)
End Sub
Private Sub Winsock1_Close(Index As Integer)
List1.AddItem "[" & Index & "] 클라이언트측 접속이 종료되었습니다."
Winsock1(Index).Close
Winsock2(Index).Close
End Sub
Private Sub Winsock1_ConnectionRequest(Index As Integer, ByVal requestID As Long)
If Winsock1(ConnIndex).State <> sckClosed Then Winsock1(ConnIndex).Close
Winsock1(ConnIndex).Accept requestID
List1.AddItem "[" & Index & "] 클라이언트와 연결되었습니다."
ReDim Preserve ConnID(ConnIndex + 1)
ConnID(ConnIndex) = requestID
Winsock2(ConnIndex).Connect
ConnIndex = ConnIndex + 1
Load Winsock1(ConnIndex)
Load Winsock2(ConnIndex)
Winsock1(ConnIndex).Protocol = sckTCPProtocol
Winsock1(ConnIndex).LocalPort = CLng(lPort)
Winsock1(ConnIndex).Listen
Winsock2(ConnIndex).Protocol = sckTCPProtocol
Winsock2(ConnIndex).RemoteHost = rHost
Winsock2(ConnIndex).RemotePort = CLng(rPort)
End Sub
Private Sub Winsock1_DataArrival(Index As Integer, ByVal bytesTotal As Long)
Dim buf As String
Winsock1(Index).GetData buf
List1.AddItem "[C->S][" & Index & "]" & buf & "(" & bytesTotal & ")"
Winsock2(Index).SendData buf
End Sub
Private Sub Winsock2_Close(Index As Integer)
List1.AddItem "[" & Index & "] 서버측 접속이 종료되었습니다."
Winsock2(Index).Close
Winsock1(Index).Close
End Sub
Private Sub Winsock2_Connect(Index As Integer)
List1.AddItem "[" & Index & "] 서버와 연결되었습니다."
End Sub
Private Sub Winsock2_DataArrival(Index As Integer, ByVal bytesTotal As Long)
Dim buf As String
Winsock2(Index).GetData buf
List1.AddItem "[S->C][" & Index & "]" & buf & "(" & bytesTotal & ")"
Winsock1(Index).SendData buf
End Sub
'Tech: > ASP·VB6' 카테고리의 다른 글
VB-IBM MQSeries 사용법 (0) | 2008.06.26 |
---|---|
MTS와 COM+에서의 Transaction (0) | 2008.06.26 |
VB-Winsock 소스2 (Client) (0) | 2008.06.26 |
VB-Winsock 소스1 (Server) (0) | 2008.06.26 |
VB-WinSock컨트롤을 이용한 Socket통신 (0) | 2008.06.26 |