Sub Main()
Dim nResult As LongnResult = WSAStartup(&H202, mwsaData)
MsgBox nResult
If nResult <> 0 Then
MsgBox "Error en WSAStartup "
Exit Sub
End Ifm_hSocket = socket(AF_INET, SOCK_RAW, IPPROTO_IP)
MsgBox m_hSocket
If (m_hSocket = 0) Then
MsgBox "Error in socket "
Exit Sub
End If
msaLocalAddr.sin_family = AF_INET
msaLocalAddr.sin_port = 0
msaLocalAddr.sin_addr.S_addr = inet_addr("192.168.1.5 ") '这里需要你自己的网卡的IP地址nResult = bind(m_hSocket, msaLocalAddr, Len(msaLocalAddr))
If (nResult = SOCKET_ERROR) Then
MsgBox "Error in bind "
Exit Sub
End IfDim InParamBuffer As Long
Dim BytesRet As Long
BytesRet = 0
InParamBuffer = 1
nResult = ioctlsocket(m_hSocket, &H98000001, 1)
If nResult <> 0 Then
MsgBox "ioctlsocket "
Exit Sub
End If
Dim strData As String
Dim nReceived As Long
'截获来的数据放在BUFF里面
Dim Buff(0 To MAX_PACK_LEN) As Byte
Dim strTitle As String * 255 '用来存储窗口的标题
Dim IPH As IPHeaderDo Until False '这个例子里,一直获取
DoEvents
nResult = recv(m_hSocket, Buff(0), MAX_PACK_LEN, 0)
If nResult = SOCKET_ERROR Then
MsgBox "Error in RecvData::recv "
Exit Do
End If
CopyMemory IPH, Buff(0), Len(IPH) '为了访问方便
Select Case IPH.proto
Case IPPROTO_TCP
'frmHookTcpip.Text1.SelText = HexIp2DotIp(IPH.sourceIP)
'frmHookTcpip.Text1.SelText = " -----> "
'frmHookTcpip.Text1.SelText = HexIp2DotIp(IPH.destIP)
'frmHookTcpip.Text1.SelText = vbCrLf
Debug.Print HexIp2DotIp(IPH.sourceIP) & " -----> " & HexIp2DotIp(IPH.destIP)
End Select
LoopnResult = shutdown(m_hSocket, 2)
nResult = closesocket(m_hSocket)
nResult = WSACancelBlockingCall
nResult = WSACleanup
End Sub

解决方案 »

  1.   

    问错地方了吧,这是vc区,不是Delphi区。
      

  2.   

    在VC里面缺少listen步骤。 delphi不懂
      

  3.   

    汗。。这明显是VB 怎么成Delphi了
      

  4.   

    不好意思,没看过vb,看过Delphi,觉得像。
      

  5.   

    猛然看到1L这句,让我心中一阵惊诧,莫非我进错地方了?
    没看过Delphi 一直用VB。。
      

  6.   

    因为你用了阻塞的SOCKET,你应该用异步的。VB只有一个线程
      

  7.   

    那么怎么才能用异步socket?
      

  8.   

    用winsock控件不是很好的选择吗?
      

  9.   

    winsock好像不能拦截远程封包吧,就是别的应用程序的封包
      

  10.   

    recv(m_hSocket, Buff(0), MAX_PACK_LEN+1, 0)