有没有这类的教程?望高手们指点一下小弟
解决方案 »
- EVERYBODY,HAPPY NEW YEAR!HAVE A NICE YEAR!
- 小弟求救!!!!拨号网络中远程访问数据库出错!!!!!急急急!!!!在线等待
- 谁能给我一个程序,就是ping远程一个IP,如果PING通则返回1,否则返回0
- 把ACCESS的数据导入EXCEL中
- 着急啊!帮忙啊!
- 请问FONTSIZE=16的字它的高和宽是多少,有公式吗?
- 在vb中如何实现链表?如果能够实现,用简单的语句写?
- 网络端口问题?高人请进
- VB datagrid列与列之间的计算(急等)
- 请教有关ADO的小问题……
- 如何设置sstab某个tab的颜色?
- 偶用compactdatabase方法压缩数据库,原库有密码,但压缩后的库文件却无密码,不知如何是好?
给你一个例子吧,2000下执行,98无效,显示结果在立即窗口中。如果你有兴趣可以对buffer中的数据进行处理。
创建一个工程,一个窗体放上两个按钮,新建一个标准模块模块代码:'代码开始
'winsocket 2.0的API声明,对照着msdn慢慢写,累死人了
Public Declare Function bind Lib "ws2_32.dll" (ByVal s As Long, addr As SOCK_ADDR, ByVal namelen As Long) As Long
Public Declare Function closesocket Lib "ws2_32.dll" (ByVal s As Long) As Long
Public Declare Function connect Lib "ws2_32.dll" (ByVal s As Long, name As SOCK_ADDR, ByVal namelen As Integer) As Long
Public Declare Function inet_addr Lib "ws2_32.dll" (ByVal cp As String) As Long
Public Declare Function htons Lib "ws2_32.dll" (ByVal hostshort As Integer) As Integer
Public Declare Function recv Lib "ws2_32.dll" (ByVal s As Long, buffer As Any, ByVal length As Long, ByVal flags As Long) As Long
Public Declare Function send Lib "ws2_32.dll" (ByVal s As Long, buffer As Any, ByVal length As Long, ByVal flags As Long) As Long
Public Declare Function shutdown Lib "ws2_32.dll" (ByVal s As Long, ByVal how As Long) As Long
Public Declare Function ioctlsocket Lib "ws2_32.dll" (ByVal s As Long, ByVal v As Long, ut As Long) As Long
Public Declare Function socket Lib "ws2_32.dll" (ByVal af As Long, ByVal type_specification As Long, ByVal protocol As Long) As Long
Public Declare Function WSACancelBlockingCall Lib "ws2_32.dll" () As Long
Public Declare Function WSACleanup Lib "ws2_32.dll" () As Long
Public Declare Function WSAGetLastError Lib "ws2_32.dll" () As Long
Public Declare Function WSAStartup Lib "ws2_32.dll" (ByVal wVersionRequired As Integer, wsData As WSA_DATA) As Long
Public Declare Function WSASocketA Lib "ws2_32.dll" (ByVal af As Long, ByVal type1 As Long, ByVal protocol As Long, lpProtocolInfo As Long, g As Long, ByVal dwFlags As Long)
Public Declare Function WSAIoctl Lib "ws2_32.dll" (ByVal s As Long, ByVal dwIoControlCode As Long, lpvInBuffer As Long, ByVal cbInBuffer As Long, lpvOutBuffer As Long, ByVal cbOutBuffer As Long, lpcbBytesReturned As Long, lpOverlapped As Long, lpCompletionRoutine As Long) As Long
'拷贝内存声明
Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal length As Long)
'延时声明
Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)'常数及结构体声明
Public Const WSADESCRIPTION_LEN = 256
Public Const WSASYS_STATUS_LEN = 128Type WSA_DATA
wVersion As Integer
wHighVersion As Integer
strDescription(WSADESCRIPTION_LEN + 1) As Byte
strSystemStatus(WSASYS_STATUS_LEN + 1) As Byte
iMaxSockets As Integer
iMaxUdpDg As Integer
lpVendorInfo As Long
End TypeType IN_ADDR
S_addr As Long
End TypeType SOCK_ADDR
sin_family As Integer
sin_port As Integer
sin_addr As IN_ADDR
sin_zero(0 To 7) As Byte
End Type
Type IPHeader
lenver As Byte
tos As Byte
len As Integer
ident As Integer
flags As Integer
ttl As Byte
proto As Byte
checksum As Integer
sourceIP As Long
destIP As Long
End TypePublic Const AF_INET = 2
Public Const SOCK_RAW = 3
Public Const IPPROTO_IP = 0
Public Const IPPROTO_TCP = 6
Public Const IPPROTO_UDP = 17
Public Const MAX_PACK_LEN = 65535
Public Const SOCKET_ERROR = -1&
窗体代码Dim mwsaData As WSA_DATA
Dim m_hSocket As Long
Dim msaLocalAddr As SOCK_ADDR
Dim msaRemoteAddr As SOCK_ADDRPrivate Sub Command1_Click()
StopFlag = False
Sleep (200)
Call Main
End SubPrivate Sub Command2_Click()
StopFlag = True
End
End SubPrivate Sub Form_Load()
StopFlag = False
End SubPrivate Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
StopFlag = True
End Sub
Sub Main()
Dim nResult As LongnResult = WSAStartup(&H202, mwsaData) 'winsock启动
DoEvents
If nResult <> WSANOERROR Then
MsgBox "WSA启动错误"
Exit Sub
End Ifm_hSocket = socket(AF_INET, SOCK_RAW, IPPROTO_IP) '获得socket句柄
DoEvents
If (m_hSocket = INVALID_SOCKET) Then
MsgBox "初始化错误"
Exit Sub
End IfmsaLocalAddr.sin_family = AF_INET
msaLocalAddr.sin_port = 4000
msaLocalAddr.sin_addr.S_addr = inet_addr("10.168.188.59") '这里需要你自己的网卡的IP地址
'不能用127.0.0.1nResult = bind(m_hSocket, msaLocalAddr, Len(msaLocalAddr)) '绑定地址和端口
DoEvents
If (nResult = SOCKET_ERROR) Then
MsgBox "绑定错误"
Exit Sub
End IfDim InParamBuffer As Long
Dim BytesRet As Long
BytesRet = 0
InParamBuffer = 1
nResult = WSAIoctl(m_hSocket, &H98000001, InParamBuffer, Len(InParamBuffer), 0, 0, BytesRet, 0, 0)
'socket模式设置
DoEvents
If nResult <> 0 Then
MsgBox "socket模式设置错误"
Exit Sub
End IfDim strData As String
Dim nReceived As Long'截获来的数据放在BUFF里面
Dim Buff(0 To MAX_PACK_LEN) As Byte
Dim IPH As IPHeader
Sleep (1000)
Do Until False '死循环抓数据包,直到程序被终止
DoEvents '适当让别的程序也动一动,我们不要把所有资源都占用了
DoEvents nResult = recv(m_hSocket, Buff(0), MAX_PACK_LEN, 0) '抓包啦,数据保存在buff(0)数组里面。
Call Sleep(200) '这条语句不能去掉,但可以调整一下范围,否则出现GPE错误。
DoEvents
If nResult = SOCKET_ERROR Then
MsgBox "抓包错误"
Exit Do
End If
CopyMemory IPH, Buff(0), Len(IPH) '把抓到的包的前二十个字节保存到自定义结构体里面
'这二十个字节是IP报头,包括IP、端口、包类型等信息
'从第二十一个字节开始就是数据了,大家有兴趣自己
'处理
Select Case IPH.proto '对包类型进行过滤,当然,也可以对端口ip进行过滤
Case IPPROTO_TCP '这里我只是对tcp报文进行处理,其他报文大家有兴趣自己
'处理了
Debug.Print HexIp2DotIp(IPH.sourceIP) & "----->" & HexIp2DotIp(IPH.destIP)
'显示数据报流向
End Select
Loop
'关闭socket
nResult = shutdown(m_hSocket, 2)
nResult = closesocket(m_hSocket)
nResult = WSACancelBlockingCall
nResult = WSACleanup
End SubFunction HexIp2DotIp(ByVal ip As Long) As String
'这个函数用来将16进制的IP信息转换成为大家习惯看的三点四段式Dim s As String, p1 As String, p2 As String, p3 As String, p4 As String
s = Right("00000000" & Hex(ip), 8)
p1 = Val("&h" & Mid(s, 1, 2))
p2 = Val("&h" & Mid(s, 3, 2))
p3 = Val("&h" & Mid(s, 5, 2))
p4 = Val("&h" & Mid(s, 7, 2))
HexIp2DotIp = p4 & "." & p3 & "." & p2 & "." & p1
End Function
可不可以给我发你做做起来了的那个工程来看看E-mail: [email protected]
OK??