在vb6中通过代理将客户端请求转发到另一台服务器

在vb6中通过代理将客户端请求转发到另一台服务器,vb6,Vb6,我有两个vb6应用程序,一个是客户端应用程序,另一个是服务器应用程序,都使用winsock控件进行通信我想要的是: 我需要做或尝试的是使服务器的应用程序自动“端口转发”从客户端到另一台服务器的传入连接 例如: 客户端的IP为0.0.0.0 我的IP是1.1.1.1 程序的IP为2.2.2.2 客户端和程序之间的正常程序连接是客户端将正常连接到程序,程序读取客户端的IP为0.0.0.0 使用此Serverapp,当客户端(0.0.0.0)连接到我的IP(1.1.1.1)时,我的IP(服务器应用)将

我有两个vb6应用程序,一个是客户端应用程序,另一个是服务器应用程序,都使用winsock控件进行通信我想要的是:

我需要做或尝试的是使服务器的应用程序自动“端口转发”从客户端到另一台服务器的传入连接

例如: 客户端的IP为0.0.0.0 我的IP是1.1.1.1 程序的IP为2.2.2.2

客户端和程序之间的正常程序连接是客户端将正常连接到程序,程序读取客户端的IP为0.0.0.0

使用此Serverapp,当客户端(0.0.0.0)连接到我的IP(1.1.1.1)时,我的IP(服务器应用)将接受来自客户端的连接,并将客户端连接到程序IP(2.2.2.2)。所以当程序读取客户端IP时,它将读取为1.1.1.1

那么如何实现这一点,请发布一个示例代码


我尝试在服务器应用程序上再添加一个winsock控件&连接到实际服务器,但如何通过服务器应用程序将客户端请求转发到实际服务器!请附上示例代码。我们将不胜感激。

很抱歉回复太晚

一个非常简单明了的解决方案可以是:

一个简单的服务器项目:

'1 form with:
'  1 winsock control: name=Winsock1
'  1 textbox control: name=Text1 multiline=true scrollbars=3
Option Explicit

Private Sub Form_Load()
  With Winsock1
    .LocalPort = 12345
    .Listen
  End With
End Sub

Private Sub Form_Resize()
  Text1.Move 0, 0, ScaleWidth, ScaleHeight
End Sub

Private Sub Winsock1_Close()
  With Winsock1
    Do
      If .State <> sckClosed Then
        .Close
      End If
    Loop Until .State = sckClosed
    .Listen
  End With 'Winsock1
  Text1.SelText = "Waiting for new client" & vbCrLf
End Sub

Private Sub Winsock1_ConnectionRequest(ByVal requestID As Long)
  With Winsock1
    If .State <> sckClosed Then
      .Close
    End If
    .Accept requestID
    Text1.SelText = "New connection from " & .RemoteHostIP & vbCrLf
  End With 'Winsock1
End Sub

Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
  Dim strData As String
  Winsock1.GetData strData
  Text1.SelText = "received: " & strData & vbCrLf
End Sub
'1 form with:
'  1 winsock control: name=Winsock1
'  1 textbox control: name=Text1 multiline=true scrollbars=3
Option Explicit

Private Sub Form_Load()
  With Winsock1
    .LocalPort = 12345
    .Listen
  End With
End Sub

Private Sub Form_Resize()
  Text1.Move 0, 0, ScaleWidth, ScaleHeight
End Sub

Private Sub Winsock1_Close()
  With Winsock1
    Do
      If .State <> sckClosed Then
        .Close
      End If
    Loop Until .State = sckClosed
    .Listen
  End With 'Winsock1
  Text1.SelText = "Waiting for new client" & vbCrLf
End Sub

Private Sub Winsock1_ConnectionRequest(ByVal requestID As Long)
  With Winsock1
    If .State <> sckClosed Then
      .Close
    End If
    .Accept requestID
    Text1.SelText = "New connection from " & .RemoteHostIP & vbCrLf
  End With 'Winsock1
End Sub

Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
  Dim strData As String
  Winsock1.GetData strData
  If CheckHeader(strData) = False Then
    Text1.SelText = "received: " & strData & vbCrLf
  End If
End Sub

Private Function CheckHeader(strData As String) As Boolean
  Dim blnHeader As Boolean
  Dim strHeaderStart As String, strHeaderEnd As String
  Dim strHeader As String
  blnHeader = False
  strHeaderStart = "@@@"
  strHeaderEnd = "###"
  If Left$(strData, Len(strHeaderStart)) = strHeaderStart Then
    If Right$(strData, Len(strHeaderEnd)) = strHeaderEnd Then
      strHeader = Mid$(strData, Len(strHeaderStart) + 1, Len(strData) - Len(strHeaderStart) - Len(strHeaderEnd))
      Text1.SelText = "Header: " & strHeader & vbCrLf
      blnHeader = True
    End If
  End If
  CheckHeader = blnHeader
End Function
'1带有以下内容的表单:
'1 winsock控件:名称=Winsock1
'1 textbox控件:name=Text1 multiline=true scrollbars=3
选项显式
专用子表单_加载()
使用Winsock1
.LocalPort=12345
听
以
端接头
私有子表单_Resize()
Text1.移动0,0,缩放宽度,缩放高度
端接头
私有子Winsock1_Close()
使用Winsock1
做
如果.State sckClosed,则
关
如果结束
循环直到.State=sckClosed
听
以“Winsock1”结尾
Text1.SelText=“等待新客户机”&vbCrLf
端接头
私有子Winsock1_ConnectionRequest(ByVal requestID尽可能长)
使用Winsock1
如果.State sckClosed,则
关
如果结束
.接受请求ID
Text1.SelText=“来自”和.RemoteHostIP&vbCrLf的新连接
以“Winsock1”结尾
端接头
私有子Winsock1_数据到达(ByVal ByTestTotal长度)
将strData设置为字符串
Winsock1.GetData标准数据
Text1.SelText=“已接收:”&strData&vbCrLf
端接头
一个简单的转发项目:

'1 form with:
'  2 winsock controls: name=Winsock1 and name=Winsock2
'  1 textbox control: name=Text1 multiline=true scrollbars=3
Option Explicit

Private Sub Form_Load()
  With Winsock1
    .LocalPort = 23456
    .Listen
  End With
  With Winsock2
    .Connect "laptop07", 12345
  End With 'Winsock2
End Sub

Private Sub Form_Resize()
  Text1.Move 0, 0, ScaleWidth, ScaleHeight
End Sub

Private Sub Winsock1_Close()
  With Winsock1
    Do
      If .State <> sckClosed Then
        .Close
      End If
    Loop Until .State = sckClosed
    .Listen
  End With 'Winsock1
  Text1.SelText = "Waiting for new client" & vbCrLf
End Sub

Private Sub Winsock1_ConnectionRequest(ByVal requestID As Long)
  With Winsock1
    If .State <> sckClosed Then
      .Close
    End If
    .Accept requestID
    Text1.SelText = "New connection from " & .RemoteHostIP & vbCrLf
  End With 'Winsock1
End Sub

Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
  Dim strData As String
  Winsock1.GetData strData
  Winsock2.SendData strData
  Text1.SelText = "forwarded: " & strData & vbCrLf
End Sub
'1带有以下内容的表单:
'2 winsock控件:name=Winsock1和name=Winsock2
'1 textbox控件:name=Text1 multiline=true scrollbars=3
选项显式
专用子表单_加载()
使用Winsock1
.LocalPort=23456
听
以
使用Winsock2
.连接“laptop07”,12345
以“Winsock2”结尾
端接头
私有子表单_Resize()
Text1.移动0,0,缩放宽度,缩放高度
端接头
私有子Winsock1_Close()
使用Winsock1
做
如果.State sckClosed,则
关
如果结束
循环直到.State=sckClosed
听
以“Winsock1”结尾
Text1.SelText=“等待新客户机”&vbCrLf
端接头
私有子Winsock1_ConnectionRequest(ByVal requestID尽可能长)
使用Winsock1
如果.State sckClosed,则
关
如果结束
.接受请求ID
Text1.SelText=“来自”和.RemoteHostIP&vbCrLf的新连接
以“Winsock1”结尾
端接头
私有子Winsock1_数据到达(ByVal ByTestTotal长度)
将strData设置为字符串
Winsock1.GetData标准数据
Winsock2.SendData标准数据
Text1.SelText=“转发:”&strData&vbCrLf
端接头
要使用,请先启动服务器,然后启动转发器

在我的示例中,服务器运行在我的笔记本电脑上,在我的网络中称为laptop07

在转发项目的代码中,将“laptop07”替换为运行服务器的机器的IP地址

服务器侦听端口12345,转发器侦听端口23456。。确保它们被允许进入防火墙

要测试它,请执行以下操作:

  • 启动服务器
  • 启动货代
  • 让您的客户端连接到端口23456上的转发器
  • 从客户端发送数据
  • 看到它在转发器中被转发了吗
  • 查看服务器正在接收它
请记住,这是一个非常简单的项目,没有任何错误捕获


这只是为了向您展示如何完成此操作

服务器项目的新代码:

'1 form with:
'  1 winsock control: name=Winsock1
'  1 textbox control: name=Text1 multiline=true scrollbars=3
Option Explicit

Private Sub Form_Load()
  With Winsock1
    .LocalPort = 12345
    .Listen
  End With
End Sub

Private Sub Form_Resize()
  Text1.Move 0, 0, ScaleWidth, ScaleHeight
End Sub

Private Sub Winsock1_Close()
  With Winsock1
    Do
      If .State <> sckClosed Then
        .Close
      End If
    Loop Until .State = sckClosed
    .Listen
  End With 'Winsock1
  Text1.SelText = "Waiting for new client" & vbCrLf
End Sub

Private Sub Winsock1_ConnectionRequest(ByVal requestID As Long)
  With Winsock1
    If .State <> sckClosed Then
      .Close
    End If
    .Accept requestID
    Text1.SelText = "New connection from " & .RemoteHostIP & vbCrLf
  End With 'Winsock1
End Sub

Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
  Dim strData As String
  Winsock1.GetData strData
  Text1.SelText = "received: " & strData & vbCrLf
End Sub
'1 form with:
'  1 winsock control: name=Winsock1
'  1 textbox control: name=Text1 multiline=true scrollbars=3
Option Explicit

Private Sub Form_Load()
  With Winsock1
    .LocalPort = 12345
    .Listen
  End With
End Sub

Private Sub Form_Resize()
  Text1.Move 0, 0, ScaleWidth, ScaleHeight
End Sub

Private Sub Winsock1_Close()
  With Winsock1
    Do
      If .State <> sckClosed Then
        .Close
      End If
    Loop Until .State = sckClosed
    .Listen
  End With 'Winsock1
  Text1.SelText = "Waiting for new client" & vbCrLf
End Sub

Private Sub Winsock1_ConnectionRequest(ByVal requestID As Long)
  With Winsock1
    If .State <> sckClosed Then
      .Close
    End If
    .Accept requestID
    Text1.SelText = "New connection from " & .RemoteHostIP & vbCrLf
  End With 'Winsock1
End Sub

Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
  Dim strData As String
  Winsock1.GetData strData
  If CheckHeader(strData) = False Then
    Text1.SelText = "received: " & strData & vbCrLf
  End If
End Sub

Private Function CheckHeader(strData As String) As Boolean
  Dim blnHeader As Boolean
  Dim strHeaderStart As String, strHeaderEnd As String
  Dim strHeader As String
  blnHeader = False
  strHeaderStart = "@@@"
  strHeaderEnd = "###"
  If Left$(strData, Len(strHeaderStart)) = strHeaderStart Then
    If Right$(strData, Len(strHeaderEnd)) = strHeaderEnd Then
      strHeader = Mid$(strData, Len(strHeaderStart) + 1, Len(strData) - Len(strHeaderStart) - Len(strHeaderEnd))
      Text1.SelText = "Header: " & strHeader & vbCrLf
      blnHeader = True
    End If
  End If
  CheckHeader = blnHeader
End Function
'1带有以下内容的表单:
'1 winsock控件:名称=Winsock1
'1 textbox控件:name=Text1 multiline=true scrollbars=3
选项显式
专用子表单_加载()
使用Winsock1
.LocalPort=12345
听
以
端接头
私有子表单_Resize()
Text1.移动0,0,缩放宽度,缩放高度
端接头
私有子Winsock1_Close()
使用Winsock1
做
如果.State sckClosed,则
关
如果结束
循环直到.State=sckClosed
听
以“Winsock1”结尾
Text1.SelText=“等待新客户机”&vbCrLf
端接头
私有子Winsock1_ConnectionRequest(ByVal requestID尽可能长)
使用Winsock1
如果.State sckClosed,则
关
如果结束
.接受请求ID
Text1.SelText=“来自”和.RemoteHostIP&vbCrLf的新连接
以“Winsock1”结尾
端接头
私有子Winsock1_数据到达(ByVal ByTestTotal长度)
将strData设置为字符串
Winsock1.GetData标准数据
如果CheckHeader(strData)=False,则
Text1.SelText=“已接收:”&strData&vbCrLf
如果结束
端接头
私有函数CheckHeader(strData作为字符串)作为布尔值
作为布尔值的Dim blnHeader
Dim strHeaderStart作为字符串,strHeaderEnd作为字符串
作为字符串的Dim strHeader
blnHeader=错误
strHeaderStart=“@@@
strHeaderEnd=“####”
如果左$(strData,Len(strHeaderStart))=strHeaderStart,则
如果右$(strData,Len(strHeaderEnd))=strHeaderEnd,则
strHeader=Mid$(strData,Len(strHeaderStart)+1,Len(strData)-Len(strHeaderStart)-Len(strHeaderEnd))
Text1.SelText=“Header:”&strHeader&vbCrLf
blnHeader=True
如果结束
如果结束
CheckHeader=blnHeader
端函数
货运代理项目新规范

'1 form with:
'  2 winsock controls: name=Winsock1 and name=Winsock2
'  1 textbox control: name=Text1 multiline=true scrollbars=3
Option Explicit

Private Sub Form_Load()
  With Winsock1
    .LocalPort = 23456
    .Listen
  End With
  With Winsock2
    .Connect "laptop07", 12345
  End With 'Winsock2
End Sub

Private Sub Form_Resize()
  Text1.Move 0, 0, ScaleWidth, ScaleHeight
End Sub

Private Sub Winsock1_Close()
  With Winsock1
    Do
      If .State <> sckClosed Then
        .Close
      End If
    Loop Until .State = sckClosed
    .Listen
  End With 'Winsock1
  Text1.SelText = "Waiting for new client" & vbCrLf
End Sub

Private Sub Winsock1_ConnectionRequest(ByVal requestID As Long)
  With Winsock1
    If .State <> sckClosed Then
      .Close
    End If
    .Accept requestID
    Text1.SelText = "New connection from " & .RemoteHostIP & vbCrLf
    SendIP .RemoteHostIP
  End With 'Winsock1
End Sub

Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
  Dim strData As String
  Winsock1.GetData strData
  Winsock2.SendData strData
  Text1.SelText = "forwarded: " & strData & vbCrLf
End Sub

Private Sub SendIP(strIP As String)
  Dim strHeaderStart As String, strHeaderEnd As String
  strHeaderStart = "@@@"
  strHeaderEnd = "###"
  Winsock2.SendData strHeaderStart & "IP Client:" & strIP & strHeaderEnd
End Sub
'1带有以下内容的表单:
'2 winsock控件:name=Winsock1和name=Winsock2
'1 textbox控件:name=Text1 multiline=true scrollbars=3
选项显式