Не удается выйти из цикла с многократной передачей буфера через TCP / Sockets .net - PullRequest
1 голос
/ 27 октября 2011

Я передаю данные через TCP / сокеты с помощью .Net (System.Net.Sockets)

Я использую этот код на стороне клиента:

tc.SendBufferSize = 4096
Dim fs As New FileStream(wfile, FileMode.Open, FileAccess.Read)
Dim rijn As New RijndaelManaged
Dim cs As New CryptoStream(fs, rijn.CreateEncryptor(CreateKey(key), CreateIV(IV)), CryptoStreamMode.Read)
Dim bytesToSend(tc.SendBufferSize) As Byte
Dim numBytesRead As Integer
Do
      numBytesRead = cs.Read(bytesToSend, 0, bytesToSend.Length)
      tcp_str.Write(bytesToSend, 0, numBytesRead)
Loop Until numBytesRead = 0
tcp_str.Flush()
cs.Close()

И этот кодна стороне сервера:

Dim FS As New FileStream(CompleteFileName, FileMode.Append, FileAccess.Write)
Dim CS As New CryptoStream(FS, Rijn.CreateDecryptor(DataExchangeKey, DataExchangeIv), CryptoStreamMode.Write)
Tcp_Client.ReceiveBufferSize = 4096
Dim bytesToRead(Tcp_Client.ReceiveBufferSize) As Byte
Dim numBytesRead As Integer = 0
Do
numBytesRead = Tcp_NetStream.Read(bytesToRead, 0,Tcp_Client.ReceiveBufferSize)
CS.Write(bytesToRead, 0, numBytesRead)
Loop Until numBytesRead = 0
Console.WriteLine("Finished")
CS.FlushFinalBlock()
CS.Close()
FS.Close()

Но сторона сервера не покидает Do / Loop, более того, она никогда не записывает последний буфер и никогда не делает CS.FlushFinalBlock ()

Любые идеиПочему?

Спасибо за помощь.

1 Ответ

4 голосов
/ 27 октября 2011

Сервер не выйдет из цикла Do, пока клиент не закроет свое соединение (что позволяет Read возвращать 0, как только все данные будут использованы).Поэтому я подозреваю, что вам просто нужно (в конце кода клиента):

tcp_str.Close()

( сброс поток сильно отличается от формально закрытие это)

Если клиент не получает до tcp_str.Close(), то убедитесь, что cs (независимо от того, что cs есть) может также обнаружить конецвходящий поток.

Обратите внимание, что все это произошло бы автоматически, если бы вы использовали Using - если вы просто отпустите сокет (нераспределенный), то он останется открытым до следующей сборки мусора (и приступает к запуску финализатора).

...