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


Posted by 떼르미
,


자바스크립트를 허용해주세요!
Please Enable JavaScript![ Enable JavaScript ]