2016-08-26 122 views
0

我有一臺服務器可以發送文件給客戶端請求它們。對於尺寸小於2演出的文件來說,它非常棒。 但是,當文件超過2演出,我的服務器在這裏會給我一個溢出錯誤昏暗的緩衝區。我查找它並發現緩衝區大小可能是(upload.SendBufferSize -1)。但是,更改這給了我一個不同的錯誤: 上傳。發送一個非阻塞套接字操作不能立即完成。VB的Socket.Send返回「一個非阻塞套接字操作無法立即完成。」

我搜索它從互聯網上,和一個建議是嘗試,如果發生錯誤添加Upload.Blocking =真,但後來我得到它說爭辯是無效的錯誤。

對我的問題的任何建議?

Private Sub UploaderAccept(ar As IAsyncResult) 
    Dim File As IO.FileInfo = ar.AsyncState 
    Dim Upload As Socket = UploadServer.EndAccept(ar) 

    '--- Determine size of buffer 
    Dim fs As New IO.FileStream(File.FullName, FileMode.Open, FileAccess.Read, FileShare.Read) 
    Dim buffer(Upload.SendBufferSize - 1) As Byte 
    Dim Sent As Long = 0 
    Dim t As Long = 0 

    '--- Actual sending 
    Do Until Sent >= File.Length 
     t = fs.Read(buffer, 0, buffer.Length) 
     Upload.Send(buffer, 0, t, SocketFlags.None) 

     Sent += t 
    Loop 

    '--- File transfer done 
    fs.Close() 

    Upload.BeginDisconnect(False, New AsyncCallback(AddressOf OnDisconnect), upload) 
    Upload.Close() 
End Sub 

回答

0

好,我知道我自己,萬一有人需要它,你不能從異步到syncronous改變做..只需使用:

Upload.BeginSend(緩衝,0,T,的Socket .None,新的AsyncCallback(AddressOf OnSend),上傳):

Do Until Sent >= File.Length 
     t = fs.Read(buffer, 0, buffer.Length) 
     If t > 0 Then 
      Upload.BeginSend(buffer, 0, t, SocketFlags.None, New AsyncCallback(AddressOf UploadOnSend), Upload) 
     End If 

     Sent += t 
     TextUpdate(lblFilePerc, Sent) 
    Loop 
    Close streams... 

Private Sub UploadOnSend(ar As IAsyncResult) 
    Dim upload As Socket = ar.AsyncState 
    upload.EndSend(ar) 

End Sub