为什么winsock发送文件只能在10k以内。大于10k就发不出去了!怎么处理!!苦哇!!
发送代码:
Public Sub SendMail(strFrom As String, strTo As String, strSubject As String, strBody As TextBox, wsk As Winsock, Optional strAttachName As String)
    
    Dim intcount As Integer
    
    Wait 0.5
     wsk.SendData "EHLO " & wsk.LocalIP & vbCrLf
    wsk.SendData "MAIL FROM:" & strFrom & vbCrLf
    
    Wait 0.5
    If strTo <> "" Then
    wsk.SendData "RCPT TO:" & strTo & vbCrLf '发送地址
    End If
    wsk.SendData "DATA" & vbCrLf
    
    Wait 0.5
    If strSubject = "" Then
      strSubject = "no subject"
    End If
    wsk.SendData "MIME-Version: 1.0" & vbCrLf
    wsk.SendData "From: " & ExtractArgument(1, strFrom, "@") & " <" & strFrom & ">" & vbCrLf
    wsk.SendData "To: <" & strTo & ">" & vbCrLf
    wsk.SendData "Subject: " & strSubject & vbCrLf
    wsk.SendData "Content-Type: multipart/mixed;" & vbCrLf
    wsk.SendData "              boundary=Unique-Boundary" & vbCrLf & vbCrLf
    wsk.SendData " [ Random garbage here ]" & vbCrLf & vbCrLf
    wsk.SendData vbCrLf & "--Unique-Boundary" & vbCrLf
    wsk.SendData "Content-type: text/plain" & vbCrLf & vbCrLf '; charset=US-ASCII
    wsk.SendData strBody.Text & vbCrLf & vbCrLf
    
    If LTrim(RTrim(strAttachName)) <> "" Then
      Dim pth As String
      pth = strAttachName
        For intcount = Len(strAttachName) To 1 Step -1
        
            If Mid(strAttachName, intcount, 1) = "\" Then
                strAttachName = Mid(strAttachName, intcount + 1)
                Exit For
            End If
            
        Next intcount
 
    Dim myfile() As Byte    Dim i As Long
    
    Open pth For Binary As #1    i = 0    Do While Not EOF(1)    i = i + 1    ReDim Preserve myfile(1 To i)    Get #1, , myfile(i)    Loop    Close #1        wsk.SendData "--Unique-Boundary" & vbCrLf
        wsk.SendData "Content-Type: multipart/parallel; boundary=Unique-Boundary-2" & vbCrLf & vbCrLf
        wsk.SendData "--Unique-Boundary-2" & vbCrLf
        wsk.SendData "Content-Type: application/octet-stream;" & vbCrLf
        wsk.SendData " name=" & strAttachName & vbCrLf
        'wsk.SendData "Content-Transfer-Encoding: base64" & vbCrLf
        wsk.SendData "Content-Disposition: inline;" & vbCrLf
        wsk.SendData " filename=" & strAttachName & vbCrLf & vbCrLf
         wsk.SendData myfile
         DoEvents
         'Dim p
         ' Do While wsk.State <> 0
         '    p = DoEvents()
         ' Loop
             
    End If
    
    wsk.SendData vbCrLf & "." & vbCrLf '#.$
    
    Wait 0.5
    
    wsk.SendData "QUIT" & vbCrLf
    
    Wait 0.5    wsk.Close
    
End Sub
为什么这样???怎么修改!!!:-(

解决方案 »

  1.   

    发送端:Public Function SendChunk()
      'This is where we send the file data
      Dim ChunkSize As Long
      Dim Chunk() As Byte
      Dim arrHash() As Byte
      
      If wsSend.State <> sckConnected Then Exit Function
      
      ChunkSize = FT_BUFFER_SIZE '自己定
      If FileNum = 0 Then 'No data has been sent yet, open the file
        FileNum = FreeFile
        Open filename For Binary As #FileNum
      End If
      
      'determine chunk size
      If (LOF(FileNum) - Loc(FileNum)) < FT_BUFFER_SIZE Then _
         ChunkSize = (LOF(FileNum) - Loc(FileNum))
      'set array size to fit chunk
      ReDim Chunk(0 To ChunkSize - 1)
      'read the chunk
      Get #FileNum, , Chunk
      'Send the data
      wsSend.SendData Chunk
      Sentbyt = Sentbyt + ChunkSize
      ByteSec = ByteSec + ChunkSize
      
      'See if file is sent
      If Sentbyt = FileSize Then 'FileSize自己先找好
        Complete = True
        Close #FileNum
      End If
    End Function
    接收端:Open Filename For Binary As #FileNumDim GotDat() As Byte
    Dim Hash As String
    ByteSec = ByteSec + bytesTotal
    Receivedbyt = Receivedbyt + bytesTotalReDim GotDat(0 To bytesTotal - 1)
    wsReceive.GetData GotDat, vbArray + vbByte
    Put #FileNum, , GotDat
    If Receivedbyt = FileSize Then
    Close #FileNum
    Complete = True
    End IfFT_BUFFER_SIZE别超过8k
      

  2.   

    用winsock传送文件时,一次最好不要传送太大,经测试最理想的时一次传4k。
      

  3.   

    是因为socket缓冲区的原因,最大好象是8K,将你的文件分成如1024字节一个包分成几次发送,接收的时候再拼接成完整的包
      

  4.   

    http://expert.csdn.net/Expert/topic/1780/1780812.xml?temp=.4685327
      

  5.   

    每次发送一点,比如1024字节,每次之间用doevents隔开
      

  6.   

    每次是8K,用Winsock1.PeekData试试