游戏开发论坛

 找回密码
 立即注册
搜索
查看: 5189|回复: 3

用VB怎么做端口映射?

[复制链接]

10

主题

96

帖子

96

积分

注册会员

Rank: 2

积分
96
发表于 2006-1-16 23:34:00 | 显示全部楼层 |阅读模式
侦听一个端口,将收到的数据发送到另一个本机端口去
请问如何实现,最好有简单明了的代码……
我大概写了一下,可能毛病严重,帮我看看也行

Option Explicit

Dim bMsg() As Byte
   
Private Sub Form_Load()

    Dim strCTemp  As String
    Dim intCPTemp As Variant
   
    '侦听端口
    Winsock1.LocalPort = 2000
    Winsock1.Listen
   
    '向Sphere转发数据
    Winsock2.RemoteHost = "127.0.0.1"
    Winsock2.RemotePort = 2001
    Winsock2.Connect
   
    Do While Winsock2.State <> 7
        If Winsock2.State = 9 Or Winsock2.State = 0 Then Winsock2.Close: Exit Do
        
        Select Case Winsock2.State
            Case 1
                strCTemp = "已打开!"
            Case 2
                strCTemp = "正在侦听.."
            Case 3
                strCTemp = "与服务器连接挂起!"
            Case 4
                strCTemp = "正在识别主机.."
            Case 5
                strCTemp = "已识别主机!"
            Case 6
                strCTemp = "正在与服务器连接.."
            Case 8
                strCTemp = "同级人员正在关闭连接.."
            Case 9
                strCTemp = "出错"
                Winsock2.Close
        End Select
        
        If Winsock2.State <> intCPTemp Then
            intCPTemp = Winsock2.State & vbCrLf
            Text1.Text = Text1.Text & strCTemp & vbCrLf
        End If
        
        DoEvents
    Loop
    If Winsock2.State = 7 Then
        Text1.Text = Text1.Text & strCTemp & "已成功连接上服务器..." & vbCrLf
    End If
   
End Sub

Private Sub Winsock1_ConnectionRequest(ByVal requestID As Long)
   
    If Winsock1.State <> sckClosed Then Winsock1.Close
    Winsock1.Accept requestID
   
End Sub

Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
   
    ReDim bMsg(bytesTotal)
    Winsock1.GetData bMsg
    Text1.Text = Text1.Text & bytesTotal & vbCrLf
    Text1.SelStart = Len(Text1.Text)
    Winsock2.SendData bMsg
   
End Sub

Private Sub Winsock2_Error(ByVal Number As Integer, Description As String, ByVal Scode As Long, ByVal Source As String, ByVal HelpFile As String, ByVal HelpContext As Long, CancelDisplay As Boolean)
   
    Text1.Text = Text1.Text & "Winsock2出错!" & vbCrLf
   
End Sub

Private Sub Winsock2_SendComplete()
   
    Text1.Text = Text1.Text & "向Sphere发送了数据.." & vbCrLf
   
End Sub

Private Sub Winsock2_SendProgress(ByVal bytesSent As Long, ByVal bytesRemaining As Long)

    Text1.Text = Text1.Text & "向Sphere发送了" & bytesSent & "数据.." & vbCrLf
   
End Sub

89

主题

822

帖子

847

积分

高级会员

Rank: 4

积分
847
发表于 2006-1-17 09:32:00 | 显示全部楼层

Re:用VB怎么做端口映射?

那个忙循环是不必要的,VB6中的Winsock控件是默认异步的,可以通过事件来处理

监听的Socket在打开状态下一般不直接去和客户端连接

另外要设置数据传输协议

10

主题

96

帖子

96

积分

注册会员

Rank: 2

积分
96
 楼主| 发表于 2006-1-17 19:22:00 | 显示全部楼层

Re:用VB怎么做端口映射?

怎么设置数据传输协议!
这个我已经写好了
我在想。。。。是不是两个程序根本不可能侦听一个端口

那么截封包之类的那些工具,是如何做到的呢。。。。。

89

主题

822

帖子

847

积分

高级会员

Rank: 4

积分
847
发表于 2006-1-18 10:29:00 | 显示全部楼层

Re:用VB怎么做端口映射?

封包截取有多种方式,常见的比如CommView

我们先来看看网络的分层,OSI模型中把网络分为7层,应用层,表示层,会话层,传输层,网络层,数据链路层,物理层。

VB的Winsock的控件是控制TCP/UDP协议的,位于传输层,同时我们的网络游戏也是基于传输层的,如果你要在同一层用一个程序去控制另一个程序,那是比较困难的,除非你对第二个程序进行修改。

为了截获封包,你就必须站在更高的层次上,那就是网络层,Winsock API提供了对网络层的控制,比如Raw Socket。我们可以直接操纵IP包,来控制他的上层协议。这种方式会有权限问题,当然如果是个人用户问题不会太大。

同时在Windows2000下,微软还提供了SPI接口,可以实现另外一种截获封包的方式,我们知道大多数网络程序都是通过Winsock API来访问网络,底层的网络接口都是通过网卡驱动来实现物理层的转换,在Winsock API和网卡驱动之间,微软还提供了另外一层中间服务SPI,我们可以通过重写SPI来控制Winsock API,很多的防火墙都是SPI防火墙。

还有第三种方式,就是我们重新编写网卡驱动,大家不要以为很难,微软提供了很方便的驱动编写模型和接口,我们可以很方便的编写一块虚拟网卡出来。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-23 06:50

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表