询问一下
  使用winsock控件发送数据时
  发送数据的语句必须放在单击事件中吗
 我想在某一窗体启动时,就发送数据
程序会报错????????代码如下:
Private Sub Form_Load()Dim Tie As String
On Error GoTo err
Winsock1.RemoteHost = Trim$(IPconnect.IPtext.Text)       '获得Linux服务器方的IP地址
Winsock1.RemotePort = 10000
Winsock1.connect                                     '进行连接Tie = "1"
Winsock1.SendData Tie
Exit Sub
err:
  MsgBox err.DescriptionEnd Sub

解决方案 »

  1.   

    我写了一个传文件的代码,对你来说,应该算是一个参考.代码如下:
    Visual Basic 6.0 文件发送端'********************版权信息********************
    '*隶属工程: FileTran1
    '*模块名称: frmMain
    '*模块描述: 发送文件
    '*成员个数: 11
    '*代码行数: 101
    '*声明行数: 16
    '*创建时间: 2006-02-21 14:22:29(创建人:MysticBoy)
    '*修改时间: 2006-02-21 14:22:29(修改人:MysticBoy)
    '*代码说明: 该模块负责发送文件。
    '*          您需要向窗体内添加一个名为ws的winsock控件。
    '*版权说明: 版权所有(c)  ?-2006  Mysticsoft.
    '*                   保留所有权
    '***********************************************
    Dim cState As String '当前状态
    Dim cmd As String '传输协议的命令
    Dim e As ErrObject ' 错误对象
    '********************成员[Command2_Click]说明信息********************
    '*代码编辑: 2006-02-21 14:49:04(MysticBoy)
    '*成员类型: 对象[Command2]的[Click]事件
    '*HelpCtID: 0
    '*成员描述:
    '*功能说明: 测试发送一个文件。
    '********************************************************************
    Private Sub Command2_Click()
    SendFile "E:\影视&音乐\韩国辣妹4th Why\Killer(boby vox).mpg", "127.0.0.1"
    '发送文件 'E:\影视&音乐\韩国辣妹4th Why\Killer(boby vox).mpg'
    MsgBox "OK"
    End Sub'********************成员[SendFile]说明信息********************
    '*代码编辑: 2006-02-21 14:49:04(MysticBoy)
    '*成员类型: 公有方法
    '*HelpCtID: 0
    '*成员描述: 发送文件
    '*输入参数: 参数名称  说明
    '*          FileName   要发送的完整文件名及其路径
    '*          RemoteHost 接受文件的主机
    '*          RemotePort [此参数可选] 接受文件的主机侦听的端口。
    '*功能说明: <在此键入说明>
    '**************************************************************
    Public Function SendFile(FileName As String, RemoteHost As String, Optional RemotePort As Long = 1123) As Boolean
    If ws.State <> 0 Then ws.Close '如果状态不为0说明正在使用,为发送当前文件,强制关闭,避免错误
    ws.Connect RemoteHost, RemotePort '连接到远程主机,该主机接受文件.
    DoEvents '释放CPU时间
     If Waiting("ok") = False Then '等待接受机回应.如果连接,在连接事件中设置状态'ok"
     SendFile = False '如果等待超时,那么返回,并退出
     Exit Function
     Else
       '连接成功。这里您可以提示用户连接成功
     End If
    ws.SendData "file" '请求发送文件
    DoEvents '这对于VB6来说,这是发送数据后,程序必须做的,如果不释放,真正的发送将在CPU空闲时
    If Waiting("filename") = False Then '等待接受机要求文件名
    SendFile = False '如果等待失败,退出
    Exit Function
    End If
    '服务器要求文件名
    ''''''''
    Dim Fnx() As String
    Fnx = Split(FileName, "\") '按照路径分隔符,分割路径
    Dim Fnam As String
    Fnam = Fnx(UBound(Fnx)) '然后取数组中最后一个索引的值,该值即文件名
    ws.SendData Fnam '发送文件名 。
    DoEvents '这对于VB6来说,这是发送数据后,程序必须做的,如果不释放,真正的发送将在CPU空闲时
    If Waiting("filedata") = False Then '等待接受机请求文件数据的命令
    SendFile = False '如果等待失败,退出 。
    Exit Function
    End IfDim fn As Long
    Dim cFileName As String
    fn = FreeFile '为打开要发送的文件准备一个有效的文件句柄
    Dim bArys() As Byte '为要发送的文件准备内存。
    ReDim bArys(FileLen(FileName) - 1) '按文件大小准备内存,注意:这里必须减一
    Open FileName For Binary As #fn
    Get #fn, , bArys '读取文件到数组中
    Close #fn
    ws.SendData bArys '发送该数组。
    DoEvents '这对于VB6来说,这是发送数据后,程序必须做的,如果不释放,真正的发送将在CPU空闲时
    cState = "sendok" '然后设置状态为发送完成。
    DoEvents '释放CPU事件。以便开始发送。
    Waiting "end" '等待发送结束。
    End Function'********************成员[Waiting]说明信息********************
    '*代码编辑: 2006-02-21 14:49:00(MysticBoy)
    '*成员类型: 公有方法
    '*HelpCtID: 0
    '*成员描述:
    '*输入参数: 参数名称  说明
    '*          txt       要等待的状态文本内容。
    '*          tmout [此参数可选] 超时
    '*功能说明: <在此键入说明>
    '*************************************************************
    Function Waiting(txt As String, Optional tmout As Long = 30) As Boolean
    Dim sn As Single
    sn = Timer
    Do Until cState = txt '一直等到状态为指定字符串时退出循环
    If tmout > 0 Then '如果设置的超时大于0
        If Timer - sn > tmout Then '开始等待的时间到目前为止的时间长超过超时时间时
        Waiting = False '等待失败。
        Exit Function '退出函数
        End If
    End If
    DoEvents '释放cpu,因为我们不能霸道 ,因为这是个多任务的平台。
    Loop
    Waiting = True '等待成功时返回 。
    End Function
    '********************成员[ws_Connect]说明信息********************
    '*代码编辑: 2006-02-21 14:49:04(MysticBoy)
    '*成员类型: 对象[ws]的[Connect]事件
    '*HelpCtID: 0
    '*成员描述: '如果连接成功设置状态为"ok"
    '*功能说明: '如果连接成功设置状态为"ok"
    '****************************************************************
    Private Sub ws_Connect()
    cState = "ok" '如果连接成功设置状态为"ok"
    End Sub'********************成员[ws_DataArrival]说明信息********************
    '*代码编辑: 2006-02-21 14:49:04(MysticBoy)
    '*成员类型: 对象[ws]的[DataArrival]事件
    '*HelpCtID: 0
    '*成员描述: 接受
    '*输入参数: 参数名称  说明
    '*          bytesTotal 接受到的数据大小
    '*功能说明:
    '********************************************************************
    Private Sub ws_DataArrival(ByVal bytesTotal As Long)
    Dim dat As String
    ws.GetData dat, , bytesTotal
    cState = dat '接受到数据后立即设置状态信息。以便Waiting结束等待
    End Sub'********************成员[ws_Error]说明信息********************
    '*代码编辑: 2006-02-21 14:49:04(MysticBoy)
    '*成员类型: 对象[ws]的[Error]事件
    '*HelpCtID: 0
    '*成员描述:
    '*输入参数: 参数名称  说明
    '*          Number   '错误代码
    '*          Description '错误描述
    '*          Scode '错误的源代码标记
    '*          Source'错误来源
    '*          HelpFile'帮助文件
    '*          HelpContext'帮助内容
    '*          CancelDisplay'是否显示
    '*功能说明:
    '**************************************************************
    Private Sub ws_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)
     e.Number = Number '如果发生意外错误。则结束自己或作其它处理,
     e.Description = Description '这里请按照你的需要来修改
    Unload Me
    End Sub
      

  2.   


    '********************成员[ws_SendComplete]说明信息********************
    '*代码编辑: 2006-02-21 14:49:04(MysticBoy)
    '*成员类型: 对象[ws]的[SendComplete]事件
    '*HelpCtID: 0
    '*成员描述:
    '*功能说明:
    '*********************************************************************
    Private Sub ws_SendComplete()
     If cState = "sendok" Then '如果是数据发送完成
       ws.Close '关闭连接
    cState = "end" '设置状态为结束。以便sendfile函数结束。
     End If
    End Sub'********************成员[ws_Close]说明信息********************
    '*代码编辑: 2006-02-21 14:49:05(MysticBoy)
    '*成员类型: 对象[ws]的[Close]事件
    '*HelpCtID: 0
    '*成员描述:
    '*功能说明:
    '**************************************************************
    Private Sub ws_Close()
    ws.Close '如果接受端断开,则关闭连接
    End Sub
    VB6文件接收端'********************版权信息********************
    '*隶属工程: FileTran
    '*模块名称: frmMain
    '*模块描述: 该模块为VB6下的文件传输的服务端
    '*成员个数: 8
    '*代码行数: 121
    '*声明行数: 23
    '*创建时间: 2006-02-21 13:43:28(创建人:MysticBoy)
    '*修改时间: 2006-02-21 14:21:19(修改人:MysticBoy)
    '*代码说明: 该代码无任何使用限制, 作者没有说明或暗示
    '*          该代码是完全可靠的,使用该代码造成的任何
    '*          损失,作者不负任和责任!
    '*          ***************注意******************
    '*          您需要添加连个winsock控件
    '*          一个命名为WS  LocalPort =1123
    '*          另为一个命名为fws Index=0
    '*版权说明: 版权所有(c)  ?-2006  Mysticsoft.
    '*                   保留所有权
    '***********************************************
    Dim n As Long
    Dim nType(32767) As Long '接受步骤。
    Dim ntl(32767) As Long '当前winsock接受到的文件的总字节数,
    Dim FileName(32767) As String '当前索引的winsock接受的文件名称。
    '********************成员[Form_Load]说明信息********************
    '*代码编辑: 2006-02-21 14:04:47(MysticBoy)
    '*成员类型: 对象[Form]的[Load]事件
    '*HelpCtID: 0
    '*成员描述: 启动时开始侦听连接
    '*功能说明:无
    '***************************************************************
    Private Sub Form_Load()
    WS.Listen
    End Sub
    '********************成员[fws_DataArrival]说明信息********************
    '*代码编辑: 2006-02-21 14:04:47(MysticBoy)
    '*成员类型: 对象[fws]的[DataArrival]事件
    '*HelpCtID: 0
    '*成员描述: 数据到达时发生,这里接受文件以及相关传输协议。
    '*输入参数: 参数名称  说明
    '*          Index     该WinSock在控件数组中的索引
    '*          bytesTotal 当前缓冲区中接收到的数据大小
    '*功能说明:
    '*********************************************************************
    Private Sub fws_DataArrival(Index As Integer, ByVal bytesTotal As Long)
    Dim cmd As String
    Dim ary() As Byte
    ReDim ary(bytesTotal) '按照收到的数据大小分配空间
    If bytesTotal > 0 Then
    Select Case nType(Index)
    Case 0
        fws(Index).GetData cmd, , bytesTotal
        Select Case cmd
            Case "file" '当到命令file时
            fws(Index).SendData "filename" '发送filename索要发送的文件名称。
            nType(Index) = 1 '该索引的winsock转到下一步骤。
            DoEvents
        End Select
         Case 1 '当步骤为1时
            fws(Index).GetData cmd, , bytesTotal
            FileName(Index) = cmd '读取到的数据为文件名
            fws(Index).SendData "filedata" '然后要求发送端发送文件数据
            nType(Index) = 2 '设置当前索引的winsock到下一步
            ntl(Index) = 1 '接收到的文件从1字节开始写入
        Case 2
            Dim fn As Long
            fn = FreeFile '获取一个有效的文件句柄
            fws(Index).GetData ary, maxlen:=bytesTotal '读取缓冲区
            Open App.Path + "\" & FileName(Index) For Binary As #fn'文件保存在程序当前路径
                Put #fn, ntl(Index), ary '打开文件在当前索引的winsock传输的位置写入收到的字节
            Close #fn '关闭,等下一个数据到来时再写入.
            ntl(Index) = ntl(Index) + bytesTotal '加上本次收到的内容大小.
        Case Else
           
    End Select
    End If
    End Sub'********************成员[WS_ConnectionRequest]说明信息********************
    '*代码编辑: 2006-02-21 14:04:47(MysticBoy)
    '*成员类型: 对象[WS]的[ConnectionRequest]事件
    '*HelpCtID: 0
    '*成员描述:
    '*输入参数: 参数名称  说明
    '*          requestID  请求标识
    '*功能说明:
    '**************************************************************************
    Private Sub WS_ConnectionRequest(ByVal requestID As Long)
    Dim x As Long
    n = n + 1
    fws(n).Accept requestID
    If n = 37267 Then '如果当前使用过的连接总数超过限制
        For x = 0 To 37267 '然后从中搜索有没有可用的.
            If FileName(x) = "" Then '如果有文件名为空的.那么就使用它
                n = x '找到后直接退出
                Exit For
            End If
        Next
    End If
    Load fws(n) '加载一个对象并接受其请求'
    End Sub'********************成员[fws_Close]说明信息********************
    '*代码编辑: 2006-02-21 14:04:48(MysticBoy)
    '*成员类型: 对象[fws]的[Close]事件
    '*HelpCtID: 0
    '*成员描述:
    '*输入参数: 参数名称  说明
    '*          Index     该WinSock在控件数组中的索引
    '*功能说明:如果该一个winsock收到了服务器方面的关闭事件,关闭该
    '*         winsock,并清除其中的相关的信息。
    '***************************************************************
    Private Sub fws_Close(Index As Integer)
    fws(Index).Close '接受到关闭事件后关闭该连接
     Me.Caption = FileName(Index) & "接受完毕: " & Index '显示接受完成
     ntl(Index) = 1 '字节位置情为1
     FileName(Index) = "" '文件名置空,为以后使用作准备
     nType(Index) = 0 '步骤设置为0
     Unload fws(Index) '卸载当前winsock,释放其占用资源
    End Sub
      

  3.   

    '********************成员[ws_SendComplete]说明信息********************
    '*代码编辑: 2006-02-21 14:49:04(MysticBoy)
    '*成员类型: 对象[ws]的[SendComplete]事件
    '*HelpCtID: 0
    '*成员描述:
    '*功能说明:
    '*********************************************************************
    Private Sub ws_SendComplete()
     If cState = "sendok" Then '如果是数据发送完成
       ws.Close '关闭连接
    cState = "end" '设置状态为结束。以便sendfile函数结束。
     End If
    End Sub'********************成员[ws_Close]说明信息********************
    '*代码编辑: 2006-02-21 14:49:05(MysticBoy)
    '*成员类型: 对象[ws]的[Close]事件
    '*HelpCtID: 0
    '*成员描述:
    '*功能说明:
    '**************************************************************
    Private Sub ws_Close()
    ws.Close '如果接受端断开,则关闭连接
    End Sub
    VB6文件接收端'********************版权信息********************
    '*隶属工程: FileTran
    '*模块名称: frmMain
    '*模块描述: 该模块为VB6下的文件传输的服务端
    '*成员个数: 8
    '*代码行数: 121
    '*声明行数: 23
    '*创建时间: 2006-02-21 13:43:28(创建人:MysticBoy)
    '*修改时间: 2006-02-21 14:21:19(修改人:MysticBoy)
    '*代码说明: 该代码无任何使用限制, 作者没有说明或暗示
    '*          该代码是完全可靠的,使用该代码造成的任何
    '*          损失,作者不负任和责任!
    '*          ***************注意******************
    '*          您需要添加连个winsock控件
    '*          一个命名为WS  LocalPort =1123
    '*          另为一个命名为fws Index=0
    '*版权说明: 版权所有(c)  ?-2006  Mysticsoft.
    '*                   保留所有权
    '***********************************************
    Dim n As Long
    Dim nType(32767) As Long '接受步骤。
    Dim ntl(32767) As Long '当前winsock接受到的文件的总字节数,
    Dim FileName(32767) As String '当前索引的winsock接受的文件名称。
    '********************成员[Form_Load]说明信息********************
    '*代码编辑: 2006-02-21 14:04:47(MysticBoy)
    '*成员类型: 对象[Form]的[Load]事件
    '*HelpCtID: 0
    '*成员描述: 启动时开始侦听连接
    '*功能说明:无
    '***************************************************************
    Private Sub Form_Load()
    WS.Listen
    End Sub
    '********************成员[fws_DataArrival]说明信息********************
    '*代码编辑: 2006-02-21 14:04:47(MysticBoy)
    '*成员类型: 对象[fws]的[DataArrival]事件
    '*HelpCtID: 0
    '*成员描述: 数据到达时发生,这里接受文件以及相关传输协议。
    '*输入参数: 参数名称  说明
    '*          Index     该WinSock在控件数组中的索引
    '*          bytesTotal 当前缓冲区中接收到的数据大小
    '*功能说明:
    '*********************************************************************
    Private Sub fws_DataArrival(Index As Integer, ByVal bytesTotal As Long)
    Dim cmd As String
    Dim ary() As Byte
    ReDim ary(bytesTotal) '按照收到的数据大小分配空间
    If bytesTotal > 0 Then
    Select Case nType(Index)
    Case 0
        fws(Index).GetData cmd, , bytesTotal
        Select Case cmd
            Case "file" '当到命令file时
            fws(Index).SendData "filename" '发送filename索要发送的文件名称。
            nType(Index) = 1 '该索引的winsock转到下一步骤。
            DoEvents
        End Select
         Case 1 '当步骤为1时
            fws(Index).GetData cmd, , bytesTotal
            FileName(Index) = cmd '读取到的数据为文件名
            fws(Index).SendData "filedata" '然后要求发送端发送文件数据
            nType(Index) = 2 '设置当前索引的winsock到下一步
            ntl(Index) = 1 '接收到的文件从1字节开始写入
        Case 2
            Dim fn As Long
            fn = FreeFile '获取一个有效的文件句柄
            fws(Index).GetData ary, maxlen:=bytesTotal '读取缓冲区
            Open App.Path + "\" & FileName(Index) For Binary As #fn'文件保存在程序当前路径
                Put #fn, ntl(Index), ary '打开文件在当前索引的winsock传输的位置写入收到的字节
            Close #fn '关闭,等下一个数据到来时再写入.
            ntl(Index) = ntl(Index) + bytesTotal '加上本次收到的内容大小.
        Case Else
           
    End Select
    End If
    End Sub'********************成员[WS_ConnectionRequest]说明信息********************
    '*代码编辑: 2006-02-21 14:04:47(MysticBoy)
    '*成员类型: 对象[WS]的[ConnectionRequest]事件
    '*HelpCtID: 0
    '*成员描述:
    '*输入参数: 参数名称  说明
    '*          requestID  请求标识
    '*功能说明:
    '**************************************************************************
    Private Sub WS_ConnectionRequest(ByVal requestID As Long)
    Dim x As Long
    n = n + 1
    fws(n).Accept requestID
    If n = 37267 Then '如果当前使用过的连接总数超过限制
        For x = 0 To 37267 '然后从中搜索有没有可用的.
            If FileName(x) = "" Then '如果有文件名为空的.那么就使用它
                n = x '找到后直接退出
                Exit For
            End If
        Next
    End If
    Load fws(n) '加载一个对象并接受其请求'
    End Sub'********************成员[fws_Close]说明信息********************
    '*代码编辑: 2006-02-21 14:04:48(MysticBoy)
    '*成员类型: 对象[fws]的[Close]事件
    '*HelpCtID: 0
    '*成员描述:
    '*输入参数: 参数名称  说明
    '*          Index     该WinSock在控件数组中的索引
    '*功能说明:如果该一个winsock收到了服务器方面的关闭事件,关闭该
    '*         winsock,并清除其中的相关的信息。
    '***************************************************************
    Private Sub fws_Close(Index As Integer)
    fws(Index).Close '接受到关闭事件后关闭该连接
     Me.Caption = FileName(Index) & "接受完毕: " & Index '显示接受完成
     ntl(Index) = 1 '字节位置情为1
     FileName(Index) = "" '文件名置空,为以后使用作准备
     nType(Index) = 0 '步骤设置为0
     Unload fws(Index) '卸载当前winsock,释放其占用资源
    End Sub
      

  4.   

    好好看一楼的例子,很详细;可以告诉你是,你的做法没有达到tcp握手的功能,一connect就发数据,当时的socket还处在connect状态中。
      

  5.   

    楼主的做法当然会出错啦~~
    Private Sub Form_Load()Dim Tie As String
    On Error GoTo err
    Winsock1.RemoteHost = Trim$(IPconnect.IPtext.Text)       '获得Linux服务器方的IP地址
    Winsock1.RemotePort = 10000
    Winsock1.connect                                     '进行连接Tie = "1"
    Winsock1.SendData Tie
    Exit Sub
    err:
      MsgBox err.DescriptionEnd Sub
    你在form_load的时候就发信息到服务端,但是那时候还没有连通到服务端,因为连接到服务端并不是一下子就可以连上去的.
    你这句Winsock1.SendData Tie应该放在
    Private Sub Winsock1_Connect()End Sub
    里面,你试试看,应该可以解决问题