如何实现Winsock应答式(HTTP)协议同步问题在一个高人的CSDN博客上抄了一段 Winsock API代码
类的地址在这里 http://blog.csdn.net/lyserver/archive/2009/11/26/4880416.aspx
复制过来太长了 帖子装不下然后我调用这个类,窗体代码如下Private Sub Command1_Click()
    Dim z As String
    Dim b As New Winsocket
    b.Disconnect
    Call b.Connect("www.baidu.com", 80)
    Call b.SendData(Text1.Text)
    b.SendBufferSize = 0
    Call b.GetData(z)
    Text2.Text = z
End Sub'Text1的内容
'GET / HTTP/1.1
'Accept: */*
'Accept-Language: zh-cn
'UA-CPU: x86
'Accept-Encoding: gzip, deflate
'User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)
'Host: www.baidu.com
'Connection: Keep-Alive
'怎么获取到的数据不全呢?只有一半数据,也不知道是不是我的调用方法错了

解决方案 »

  1.   

    由于是非阻塞,在使用GetData函数时需要自己在循环里多次调用然后根据某一标志判断数据是否结束。
      

  2.   

    比如我在另一个类里写了这样一个函数用来读套接字数据:
    Private Function ReadEcho(Optional ByVal strEOF As String = vbCrLf, Optional ByVal lngTimeout As Long = 20000) As String
        Dim lngStartTime As Long
        Dim strBuffer As String, strResult As String
        
        lngStartTime = GetTickCount
        Do
            strBuffer = ""
            m_objWinSock.GetData strBuffer
            If Len(strBuffer) > 0 Then
                strResult = strResult & strBuffer
                If InStr(strResult, strEOF) Then Exit Do
            End If
            DoEvents
        Loop Until GetTickCount - lngStartTime > lngTimeout
        ReadEcho = strResult
    End Function
      

  3.   

    没有找到你说的另外一个类 包含Private Function ReadEcho(Optional ByVal strEOF As String = vbCrLf, Optional ByVal lngTimeout As Long = 20000) As String
      Dim lngStartTime As Long
      Dim strBuffer As String, strResult As String
        
      lngStartTime = GetTickCount
      Do
      strBuffer = ""
      m_objWinSock.GetData strBuffer
      If Len(strBuffer) > 0 Then
      strResult = strResult & strBuffer
      If InStr(strResult, strEOF) Then Exit Do
      End If
      DoEvents
      Loop Until GetTickCount - lngStartTime > lngTimeout
      ReadEcho = strResult
    End Function
    的 是哪个阻塞的吗?好像没有
    '本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/lyserver/archive/2009/11/15/4812864.aspx'本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/lyserver/archive/2009/11/26/4880416.aspx
    这两个都看了
      

  4.   

    恩 看了江南春大哥的指导 大致懂了 
    呵呵 
    大哥帮忙看看这样对不
    我用的是你那个阻塞的类Private Sub Command3_Click()
        Dim w1 As New Winsocket
        Dim ccc As String
        Text2 = Get_HTTP("/")'生成HTTP协议的封包
        Call w1.Connect("www.baidu.com", 80)
        zz = w1.SendData(Text2.Text)
        is_out = ""
        Do
            z = w1.GetData(ccc)
            If Len(ccc) > 0 Then
                is_out = is_out & ccc
                If InStr(is_out, "</html>") Then Exit Do'结束标志
            End If
        Loop
        Text1.Text = is_out
    End Sub
    这样可以不?
    另外这种最好怎么做出错处理比较好,
    比如中途掉线
      

  5.   

    如果想方便地获得close事件,则使用非阻塞的那个类。