草庐IT

m_NetworkStream

全部标签

c# - 防止 TcpClient 的 NetworkStream ReadTimeout 关闭套接字

我有一个类通过TCP与设备通信。我发送命令,然后在TcpClient的GetStream()上发出stream.Read(reply,0,1)。我读出每个字节,然后将读取的字节组合成一个字符串,并将该字符串与终止字符串进行比较,让我知道何时停止读取。设备软件存在一些缺陷,导致终止字符串并不总是发送。我想以适当的方式处理这个问题,并用一段时间来确定是否应该停止读取。如果我将stream.ReadTimeout设置为-1以外的值,那么当超过此超时时套接字将关闭,这是我不希望的到。如果我将stream.BeginRead(..)与stream.ReadTimeout=-1一起使用,那么我将在

c# - 如何确保从 NetworkStream 读取所有数据

当DataAvailable为false时,是否确定所有数据都从NetworkStream中读取?或者数据的发送方是否必须先发送数据的长度。并且我必须读取直到读取了发送方指定的字节数?示例:privateByte[]ReadStream(NetworkStreamns){varbl=newList();varreceivedBytes=newByte[128];while(ns.DataAvailable){varbytesRead=ns.Read(receivedBytes,0,receivedBytes.Length);if(bytesRead==receivedBytes.Len

c# - 两个并发的 NetworkStream.BeginWrite 调用会发生什么?

我的Sender类有两个方法:publicvoidSendMessage(OutgoingMessagemsg){try{stream.BeginWrite(msg.TcpData,0,16,messageSentCallback,msg);}catch{//...}}privatevoidmessageSentCallback(IAsyncResultresult){stream.EndWrite(result);if(result.IsCompleted)onDataSent(result.AsyncStateasOutgoingMessage);}程序的其他部分可以调用(如果它们

c# - 将完整的消息写入 NetworkStream 或写入每条消息的各个部分是个好主意吗?

我想知道将完整消息写入NetworkStream是否比在多个Write调用中写入消息的每个部分更好。例如,将消息完整地写成这样......NetworkStreamns=tcpClient.GetStream();byte[]message=Encoding.ASCII.GetBytes("Thisisamessage.");ns.Write(message,0,message.Length);...比这样写更好...NetworkStreamns=tcpClient.GetStream();byte[]message1=Encoding.ASCII.GetBytes("This");

c# - 为什么 NetworkStream.Read 这么慢?

我知道,这里已经有很多类似的问题,但我没有找到让它更快的解决方案或者为什么它这么慢的原因?我们在C#.NET中有一个应用程序需要通过TCP与响应同一TCP流(全部以字节为单位)的设备进行通信。消息的发送速度非常快(大约20毫秒),但是当我们使用NetworkStream.Read()方法(或类似的Socket.Receive())从TCP套接字读取数据时,大约需要600毫秒。我通过在Read方法之前启动秒表并在Read之后立即停止来获得这个数字。我还使用Wireshark记录流量,在那里我看到通信进行得非常快(使用TCPNoDelay和TCPAckFrequency注册表黑客)但是我看

c# - TcpClient 的 NetworkStream 什么时候完成一次读操作?

我正在从事一个涉及通过TCP和GoogleProtocolBuffer进行客户端服务器通信的项目。在客户端,我基本上使用NetworkStream.Read()来阻止通过字节数组缓冲区从服务器读取。根据MSDN文档,Thismethodreadsdataintothebufferparameterandreturnsthenumberofbytessuccessfullyread.Ifnodataisavailableforreading,theReadmethodreturns0.TheReadoperationreadsasmuchdataasisavailable,uptothe

C# NetworkStream - 在读取时区分关闭的套接字和 0 字节数组

[已解决,问题是基于不正确的假设]在使用TCP时,我遇到了NetworkStream.Read在两种不同情况下返回值0的问题,我很难区分这两种情况。一些背景知识-我有一个有效的客户端-服务器解决方案,使用长度前缀消息通过TCP进行通信。然而,由于大多数通信(除了一些初始消息交换)发生在客户端与服务器之间,服务器没有很好的方法来知道客户端是否仍然连接。找出这一点的一种方法是不时向客户发送一些东西,这就是我决定要做的。我知道我可以在我的协议(protocol)中添加专用的“ping”消息,并在客户端中简单地忽略它,但我也在测试其他可能性。我试过的一件事是像这样向客户端发送一个空字节数组:n

TcpClient/NetworkStream 未检测到断开连接

我使用TcpClient和NetworkStream为我们的游戏创建了一个简单的持久套接字连接。正常连接、发送消息和断开连接(退出应用程序/服务器关闭/等)都没有问题。但是,我遇到了一些问题,在某些情况下,客户端没有检测到与服务器的断开连接。我对此进行测试的最简单方法是拔掉wifi盒上的网络电缆,或将手机设置为飞行模式,但它发生在游戏中,否则应该是稳定的wifi。通过NetworkStream等文档,它说检测断开连接的唯一方法是尝试写入套接字。很公平,除了,当我尝试时,写入通过,好像没有任何问题。我可以像这样写多条消息,一切似乎都很好。只有当我重新插入电缆时,它才会发现它已断开连接(所

c# - 指示远程主机已关闭连接的 NetworkStream.Read 的替代方法?

关于使用TcpClient类处理TCP/IP连接,除了等待NetworkStream.Read方法返回0? 最佳答案 您可以在TcpClient.Client上使用IOControlCode.KeepAliveValues来保证至少在指定的时间间隔内进行保持事件检查,然后检查TcpClient.Client.Connected属性。如何使用它的示例:structtcp_keepalive{publicintOnOff;publicintKeepAliveTime;publicintKeepAliveInterval;publicun

c# - NetworkStream 和 TcpClient 有多少缓冲区?

我们正在编写一个TCPServer和Client程序。TcpClient缓冲区中有多少空间?比如,它会在什么时候开始丢弃数据?我们正在尝试确定TcpClient是否可以阻塞,或者它是否应该进入它自己的后台线程(这样缓冲区就不会变满)。 最佳答案 您可以从TcpClient.ReceiveBufferSize中获取缓冲区大小和TcpClient.SendBufferSize.可用的缓冲区大小将随着数据在TCP级别的接收/确认(或未确认)而变化。TcpClient默认是阻塞的。没有数据会因为缓冲区已满而被丢弃,尽管数据可能会在错误情况下