2016-08-26 20 views
0

У меня есть сервер, который может отправлять файлы клиентам, запрашивающим их. Он отлично работает с файлами размером менее 2 концертов. Однако, если файл превышает 2 концерта, мой сервер здесь даст мне ошибка переполнения по адресу Dim buffer. Я искал его и обнаружил, что размер буфера может быть (upload.SendBufferSize -1). Тем не менее, изменение этого дает мне другую ошибку: Загрузить.Отправить: Невозможно завершить операцию блокировки сокета.VB Socket.Send возвращает «Операция без блокировки сокетов не может быть выполнена немедленно».

Я искал его из Интернета, и было предложено попробовать добавить Upload.Blocking = True, если возникла ошибка, но затем я получаю сообщение об ошибке, которое говорит, что аргумент недействителен.

Любые предложения по моей проблеме?

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

Хорошо, я это сам, в случае, если кто-то нуждается в этом, вы не можете сделать это, изменив от асинхронной до Синхронный .. Просто используйте:

Upload.BeginSend (буфер, 0, т, SocketFlags .None, New 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 

 Смежные вопросы

  • Нет связанных вопросов^_^