c# - 无法通过 TCP/Sockets .net 退出具有多个缓冲区传输的循环

标签 c# .net vb.net tcp stream

我正在使用 .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/

相关文章:

c# - 在属性的父引用更改后刷新属性的绑定(bind)

.net - BackgroundWorker 很酷,但只报告进度

asp.net - 更改用户控件中标签文本的最佳方法是什么?

c# - 按版本对字符串列表进行排序

c# - 从 VBA 访问 .NET 通用对象

.net - 如何从 Graphics 对象创建 Bitmap 对象?

vb.net - SQLITE 仅从文本字段中选择数值

.net - 每当我们访问属性时,我们是否应该声明一个局部变量?

c# - 动态改变jwplayer视频路径

c# - EntityFramework 查询操作、数据库提供程序包装、数据库表达式树