我是菜鸟,刚开始用WINSOCK
写程序的时候,winsock打开连接后,sendData只能执行一次,如果不close connection的话,就无法执行sendData,提示连接状态错误。听说可以连续sendData,具体哪部操作没有执行,请教,帮帮忙!或者有没有WINSOCK的教程介绍给小弟,英文、中文都没关系,多谢先啦

解决方案 »

  1.   

    有人问过 再贴一次 呵呵最好在SendComplete事件触发后再发送第2个数据
    '着要看具体问题的,下面只是一个简单的例子 我也没调试过 
    Private m_strBuff() As String '发送数据的缓冲区
    Private m_CurBuffIndex As Integer '当前发送第几个数据Private Sub Command1_Click()
        '假设所有要发送的数据都存在m_strBuff数组里面了
        m_CurBuffIndex = 0 '先发送第一个
        Winsock1.SendData m_strBuff(m_CurBuffIndex)
    End Sub
      

  2.   

    Private m_strBuff() As String '发送数据的缓冲区
    Private m_CurBuffIndex As Integer '当前发送第几个数据Private Sub Command1_Click()
        '假设所有要发送的数据都存在m_strBuff数组里面了
        m_CurBuffIndex = 0 '先发送第一个
        Winsock1.SendData m_strBuff(m_CurBuffIndex)
    End SubPrivate Sub Winsock1_SendComplete()
        '发送完毕 接着发
        m_CurBuffIndex = m_CurBuffIndex + 1
        If m_CurBuffIndex <= UBound(m_strBuff) Then
            Winsock1.SendData m_strBuff(m_CurBuffIndex)
        Else
            'm_strBuff数组的数据全部发送完毕
            '初始化m_CurBuffIndex m_strBuff
            m_CurBuffIndex = 0
            ReDim m_strBuff(0)
        End If
    End Sub
      

  3.   

    下列步骤创建一个非常简单的服务器:要创建一个 TCP 服务器,请按照以下步骤执行: 创建新的 Standard EXE 工程。
    将缺省窗体的名称改为 frmServer。
    将窗体的标题改为“TCP 服务器”。
    在窗体中放入一个 Winsock 控件,并将它的名字改为 tcpServer。
    在窗体上添加两个 TextBox 控件。将第一个命名为 txtSendData,第二个为 txtOutput。
    为窗体添加如下的代码。 
    Private Sub Form_Load()
    '将 LocalPort 属性设置为一个整数。
    '然后调用 Listen 方法。
    tcpServer.LocalPort = 1001
    tcpServer.Listen 
    frmClient.Show '显示客户端的窗体。
    End SubPrivate Sub tcpServer_ConnectionRequest _
    (ByVal requestID As Long)
    '检查控件的 State 属性是否为关闭的。
    '如果不是,
    '在接受新的连接之前先关闭此连接。
    If tcpServer.State <> sckClosed Then _
    tcpServer.Close
    '接受具有 requestID 参数的
    '连接。
    tcpServer.Accept requestID
    End SubPrivate Sub txtSendData_Change()
    '名为 txtSendData 的 TextBox 控件中
    '包含了要发送的数据。当用户往文本框中
    '键入数据时,使用 SendData 方法
    '发送输入的字符串。
    tcpServer.SendData txtSendData.Text
    End SubPrivate Sub tcpServer_DataArrival _
    (ByVal bytesTotal As Long)
    '为进入的数据声明一个变量。
    '调用 GetData 方法,并将数据赋予名为 txtOutput 
    '的 TextBox 的 Text 属性。
    Dim strData As String
    tcpServer.GetData strData
    txtOutput.Text = strData
    End Sub上面的步骤创建了一个简单的服务器应用程序。为了使它能够工作,还必须为它创建一个客户端的应用程序。要创建 TCP 客户端,请按照以下步骤执行: 在工程中添加一个新的窗体,将其命名为 frmClient。
    将窗体的标题改为“TCP Client”。
    在窗体中添加一个 Winsock 控件,并将其命名为 tcpClient。
    在 frmClient 中添加两个 TextBox 控件。将第一个命名为 txtSend,第二个为 txtOutput。
    在窗体上放一个 CommandButton 控件,并将其命名为 cmdConnect。
    将 CommandButton 控件的标题改为 Connect。
    在窗体中添加如下的代码。 
    重点   必须将 RemoteHost 属性值修改为您的计算机的名字。Private Sub Form_Load()
       'Winsock 控件的名字为 tcpClient。
       '注意:要指定远程主机,可以使用
       ' IP 地址(例如:"121.111.1.1"),也可以使用
       '计算机的“好听的名字”如下所示。
       tcpClient.RemoteHost = "RemoteComputerName"
       tcpClient.RemotePort = 1001
    End SubPrivate Sub cmdConnect_Click()
       '调用 Connect 方法,初始化连接。
       tcpClient.Connect
    End SubPrivate Sub txtSendData_Change()
       tcpClient.SendData txtSend.Text
    End SubPrivate Sub tcpClient_DataArrival _
    (ByVal bytesTotal As Long)
       Dim strData As String
       tcpClient.GetData strData
       txtOutput.Text = strData
    End Sub上面的代码创建了一个简单的客户/服务器模式的应用程序。我们可以将两者都运行起来:运行工程,然后单击“连接”。在两个窗体之一的 txtSendData 文本框中键入文本,可以看到同样的文字将出现在另一个窗体的 txtOutput 文本框中
      

  4.   

    点石,不好意思,因为我不知道应该查询什么关键字,所以查了很久,都找不到想关的帖,你的方法我等等试试
    用数组来作为sendData的缓冲区,就可以多次发送数据了吗?楼上,你这个只是WINSOCKET的简单入门吧,有没有详细的WINSOCKET的资料
      

  5.   

    msdn的资料只要理解了就什么都能写出来的
      

  6.   

    希望大家不会觉得太长了 ;)
    那些乱码只是些注释来的
    Option Explicit
    Dim timer_Begin
    Dim iTotal_Bytes_Recieve As Double, iTotal_Bytes As Double
    Dim blGet_First As BooleanPrivate Sub init()
        sFile_Content.Text = ""
        iTotal_Bytes_Recieve = 0
        blGet_First = True
        
        If socket_thief.State = 0 Then init_thief
    End SubPrivate Sub init_thief()
        'init socket_thief
        With socket_thief
            .RemoteHost = strHost.Text
            .RemotePort = intPort.Text
            .Protocol = sckTCPProtocol
        End With
    End SubPrivate Sub Request_Send(sURL)
        Dim sCmd
        
        status_show "send request..."
        
        sCmd = "GET " + sURL + " HTTP/1.0" + vbCrLf 'GET &Icirc;&ordf;FTP&Atilde;ü&Aacute;&icirc;
        sCmd = sCmd + "Accept: */*" + vbCrLf '&Otilde;&acirc;&frac34;&auml;&iquest;&Eacute;&Ograve;&Ocirc;&sup2;&raquo;&Ograve;&ordf;s
        sCmd = sCmd + "Accept: text/html" + vbCrLf '&Otilde;&acirc;&frac34;&auml;&iquest;&Eacute;&Ograve;&Ocirc;&sup2;&raquo;&Ograve;&ordf;
        sCmd = sCmd + vbCrLf '&frac14;&Ccedil;×&iexcl;&Ograve;&raquo;&para;¨&Ograve;&ordf;&frac14;&Oacute;&Eacute;&Iuml;vbCrLf
        socket_thief.SendData sCmd
        
        timer_Begin = Timer()
    End SubPrivate Sub cmdConnection_Click()
        status_show "ready.."
        
        If socket_thief.State <> 0 Then
            'socket_thief.Close
            Request_Send (strURL.Text)
        Else
            init
            socket_thief.Connect
        End If
    End SubPrivate Sub Form_Load()
        strURL.Text = "http://baby.zjjs.net/test_http.asp"
           
        iTotal_Bytes_Recieve = 0
    End SubPrivate Sub socket_thief_Close()
        'socket_thief.Close
        
        status_show "closed ×&Uuml;&Oacute;&Atilde;&Ecirc;±&pound;&ordm;" & (Timer() - timer_Begin) & " ×&Uuml;&Iuml;&Acirc;&Ocirc;&Oslash;×&Ouml;&frac12;&Uacute;&Ecirc;&yacute;&pound;&ordm;" & iTotal_Bytes_Recieve
    End SubPrivate Sub socket_thief_Connect()
        Request_Send (strURL.Text)
    End SubPrivate Sub socket_thief_DataArrival(ByVal bytesTotal As Long)
        Dim sBuffer As String
        Dim iPtr As Integer
        
        status_show "loading........"
        
        socket_thief.GetData sBuffer, vbString
        iTotal_Bytes_Recieve = iTotal_Bytes_Recieve + bytesTotal
        
        If blGet_First = False Then
        Else
            'test
            iPtr = InStr(sBuffer, "Content-Length:") + Len("Content-Length:")
            If iPtr > 0 Then
                If Len(iPtr) > 0 Then iTotal_Bytes = Mid(sBuffer, iPtr, InStr(iPtr + 1, sBuffer, vbCrLf) - iPtr)
                
                iPtr = InStr(sBuffer, vbCrLf & vbCrLf)
                sBuffer = Right(sBuffer, Len(sBuffer) - iPtr - 2)
                iTotal_Bytes_Recieve = iTotal_Bytes_Recieve - iPtr - 2
            End If
            
            blGet_First = False
        End If
        
        sFile_Content.Text = sFile_Content.Text + sBuffer
    End SubPrivate Sub socket_thief_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)
        MsgBox Description
    End SubPrivate Sub status_show(str)
        sStatus.Caption = str & vbCrLf & "sock state = " & socket_thief.State & " total_bytes = " & iTotal_Bytes
    End SubPrivate Sub strURL_Change()
        'reSet Host & File .Text
        Dim sURL As String
        Dim iPtr1 As Integer, iPtr2 As Integer, iPtr3 As Integer
        
        sURL = strURL.Text
        
        'Host Value
        iPtr1 = InStr(sURL, ".")
        iPtr3 = InStrRev(sURL, "/", iPtr1 - 1)
        If iPtr3 > 0 Then iPtr1 = iPtr3 + 1 Else iPtr1 = 1
        iPtr2 = InStr(iPtr1, sURL, "/")
        If iPtr2 = 0 Then iPtr2 = Len(sURL) + 1
        
        strHost.Text = Mid(sURL, iPtr1, iPtr2 - iPtr1)
        
        'File Value
        iPtr1 = InStrRev(sURL, "/")
        If iPtr1 = 0 Then iPtr1 = 1 Else iPtr1 = iPtr1 + 1
        iPtr2 = Len(sURL) + 1
        
        strFile.Text = Mid(sURL, iPtr1, iPtr2 - iPtr1)
    End Sub
      

  7.   

    我试了用数组的方式来进行连续的sendData,但是这个连续的过程也只限于winsock发生close的事件以前
    是不是winsock.DataArival以后就会发生winsock_close的?
    那这样的话,就不能以一个session值连续访问一个网站的不同页面了?刚才那代码太多废话了,帖个最简单的
    Private Sub Command1_Click()
        If Winsock1.State = 0 Then Winsock1.Connect Else get_data
    End SubPrivate Sub Form_Load()
        Winsock1.RemoteHost = "baby.zjjs.net"
    End SubPrivate Sub get_data()
        Dim sCmd
        
        sCmd = "Get http://baby.zjjs.net/test_http.asp HTTP/1.0" + vbCrLf + vbCrLf
        
        Winsock1.SendData sCmd
    End Sub
      

  8.   

    Private Sub Winsock1_Connect()
        '断开后 连接上 继续发
        If Len(m_strBuff(m_CurBuffIndex)) > 0 Then
            Winsock1.SendData m_strBuff(m_CurBuffIndex)
        End If
    End Sub
      

  9.   

    和网站后台有关系的吗?
    网站服务器是IIS 6。0,用ASP VBSCRIPT写的
      

  10.   

    是不是执行这里出错Private Sub cmdConnection_Click()
        status_show "ready.."
        
        If socket_thief.State <> 0 Then
            'socket_thief.Close
            Request_Send (strURL.Text)
        Else
            init
            socket_thief.Connect
        End If
    End Sub
    还是执行那里出错
      

  11.   

    如果后台是java 的话也会出现这种情况
      

  12.   

    当然是socket_thief.sendData sCmd执行错误,提示连接状态错误之类的,具体不记得,而且我现在的机没办法调试;(
      

  13.   

    Private Sub Request_Send(sURL)
        Dim sCmd
        
        status_show "send request..."
        
        sCmd = "GET " + sURL + " HTTP/1.0" + vbCrLf 'GET &Icirc;&ordf;FTP&Atilde;ü&Aacute;&icirc;
        sCmd = sCmd + "Accept: */*" + vbCrLf '&Otilde;&acirc;&frac34;&auml;&iquest;&Eacute;&Ograve;&Ocirc;&sup2;&raquo;&Ograve;&ordf;s
        sCmd = sCmd + "Accept: text/html" + vbCrLf '&Otilde;&acirc;&frac34;&auml;&iquest;&Eacute;&Ograve;&Ocirc;&sup2;&raquo;&Ograve;&ordf;
        sCmd = sCmd + vbCrLf '&frac14;&Ccedil;×&iexcl;&Ograve;&raquo;&para;¨&Ograve;&ordf;&frac14;&Oacute;&Eacute;&Iuml;vbCrLf
    '+这个判断然后测试,然后告诉我debug的值
        If socket_thief.state = 7 Then
        socket_thief.SendData sCmd
        Else
    debug.print socket_thief.state 
            MsgBox "错误或者未连接"
        End If
        timer_Begin = Timer()
    End Sub
      

  14.   

    sckClosing  8 同级人员正在关闭连接 也就是服务器关闭连接
    一般web服务器 传输完数据后 为了节省资源都关闭连接的//那这样的话,就不能以一个session值连续访问一个网站的不同页面了?主要你在发送的http头里面加上 cookie:KUYGSDFHSG23983045UEDFGSDFG....(cookie值)
    其中cookie值是服务器连接后返回给你的 你只要读取 返回的http头里的cookie值 就可以了
      

  15.   

    哦,i see
    但是这样能保证做到:以一个session值连续访问一个网站的不同页面了
    现在我在办公室测试不了,回家再试试,先多谢各位大哥啦 :)但是还有个问题,我连接的网站是我办公室的机,我那个站点是“保持HTTP连接”,为什么还会断开
    :(,这个不是主要问题,只是随便问问 :)两位大哥有QQ或者MSN吗?以后还要向两位大哥请教
    我的QQ是:17305022,msn:[email protected]
      

  16.   

    回家再看看《TCP/IP详解》关于HTTP方面的资料;)
      

  17.   

    哎!竟然这个网站竟然没有COOKIE,怎么办? :(
      

  18.   

    没有cookie 就不用加cookie头了 说明他没有使用session 
    使用了 session 肯定前面会加 cookie 头
      

  19.   

    Yeah!!
    加了COOKIE头真的可以保持获得的sessionID不变!!
    之前我查看没有COOKIES文件,以为没有COOKIE传下来,真是菜 ^O^多谢 点头大哥!!我继续研究一下,麻烦你到我另外一帖里面随便留个言,加分给你
      

  20.   

    还有,能交个朋友吗,我比较喜欢网络编程方面的东西。
    还有些小疑问想请教你,应该不会很麻烦你的譬如你怎么知道是通过cookie可以保持SESSIONID的,我看了《TCP/IP详解》里面讲到TCP(面向字节的数据流)和HTTP(面向报文)之间的解决方法,但是没有详细讲到怎么实现。
    你是在哪里查到的资料,还是通过分析数据包知道的我发现很多东西在GOOGLE挺难找得到真正需要的(可能我不大会查吧),MSDN都是新的东西,要查些这么古老的都不知道哪里找,hehe
      

  21.   

    我还看过IE的实现方法好象并不是通过cookie来重新获取sessionID的,因为IE对于纯文本的网页不轮刷新多少次,由此到终都是保持一个连接,直到IIS的连接超时才会断开连接而通过cookie来实现的,就是每次都要新建一个连接,不知道是不是因为发送的请求不同而不同,还是IE的实现方法不一样。我请求里面的是HTTP/1.0,根据HTTP的RFC,1.0没有保持连接的形式。
    但是我没办法发送HTTP/1.0的请求,发送过去就返回400错误,同一个服务器,我的服务器上面已经设置是保持连接,为什么会这样?