我正在使用 .Net (System.Net.Sockets) 通过 TCP/套接字传输数据
我在客户端使用这段代码:
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()
有什么想法吗?
感谢您的帮助。
最佳答案
服务器不会离开 Do
循环,直到客户端关闭他们的连接(允许 Read
在数据全部消耗后返回 0)。因此,我怀疑您只需要(在客户端代码的末尾):
tcp_str.Close()
(刷新流与正式关闭流非常不同)
如果客户端没有得到到tcp_str.Close()
,那么检查cs
(无论cs
is) 也检测传入流的结尾。
请注意,如果您使用了 Using
,所有这一切都会自动发生 - 如果您只是放开套接字(未处理),那么它将保持打开状态,直到垃圾收集下一次触发(并获取围绕运行终结器)。
关于c# - 无法通过 TCP/Sockets .net 退出具有多个缓冲区传输的循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7909647/