Tag: networkstream

TcpClient的NetworkStream何时完成一次读操作?

我正在开发一个涉及通过TCP和Google协议缓冲区进行客户端服务器通信的项目。 在客户端,我基本上使用NetworkStream.Read()通过字节数组缓冲区从服务器进行阻塞读取。 根据MSDN文档, 此方法将数据读入buffer参数并返回成功读取的字节数。 如果没有可用于读取的数据,则Read方法返回0. Read操作读取尽可能多的数据,最多为size参数指定的字节数。 如果远程主机关闭连接,并且已收到所有可用数据,则Read方法立即完成并返回零字节。 与异步读取(NetworkStream.BeginRead和EndRead)的情况相同。 我的问题是Read()/ EndRead()何时返回? 看起来它会在填充缓冲区中的所有字节后返回。 但在我自己的测试中,情况并非如此。 在一次操作中读取的字节变化很大。 我认为这是有道理的,因为如果在发送消息时服务器端有暂停,客户端不应该等到读取缓冲区已经填满。 Read()/ EndRead()本身是否有一些超时机制? 我试图找出Mono如何在NetworkStream中实现Read()并跟踪,直到调用extern方法Receive_internal()。

读取NetworkStream不会提前流

我有一个客户端 – 服务器应用程序,其中服务器传输一个4字节的整数,指定下一次传输的大小。 当我在客户端读取4字节整数(指定FILE_SIZE)时,下次读取流时,我得到FILE_SIZE + 4字节读取。 从此流中读取时是否需要将偏移量指定为4,或者是否有办法自动推进NetworkStream以使我的偏移量始终为0? 服务器 NetworkStream theStream = theClient.getStream(); //… //Calculate file size with FileInfo and put into byte[] size //… theStream.Write(size, 0, size.Length); theStream.Flush(); 客户 NetworkStream theStream = theClient.getStream(); //read size byte[] size = new byte[4]; int bytesRead = theStream.Read(size, 0, 4); … //read content byte[] content = new byte[4096]; bytesRead […]

即使数据可用,从端口读取信息也会等待

我在向套接字发送信息并收到响应时遇到问题。 我有一个正确执行的演示程序,所以我知道它不是另一端客户端的问题。 发送requestData并且客户端正常运行并响应,但我的代码永远不会退出读取响应中的循环。 在我倾听之前,客户能否做出回应? 如何确保我不会错过传入的消息? networkStream = tcpClient.GetStream(); StreamWriter clientStreamWriter = new StreamWriter(); clientStreamWriter.WriteLine(requestData); clientStreamWriter.Flush(); // Continuously read data on the socket and if it is more than just a ping, read the response. StringBuilder sbReadBuffer = new StringBuilder(); while (true) { String response = readresponse(timeoutOn30Seconds); if (response.Length > 1 && (!response.Contains(“\r\n”) || response.Contains(“,”))) { […]

c#NetworkStream write()和read()

我想知道如何阻止Networkstream.Read()阻止线程。 我有单独的线程,其中NetworkStream.Read()正在等待来自服务器的数据。 假设用户按下一些向服务器发送一些数据的按钮。 但是,当其他线程中有NetworkStream.Read()等待数据时,我无法调用NetworkStream.Write() 。 我可以每次锁定NetworkStream但NetworkStream.Read()将阻塞线程,所以在读取至少1个字节之前我不能发送数据。

如何(重复)读取.NET SslStream超时?

我只需要从SslStream读取N个字节,但如果在超时之前没有收到任何字节,则取消,同时让流保持有效状态以便稍后再试。 (*) 对于非SSL流,即NetworkStream只需使用其ReadTimeout属性即可轻松完成,这将使流在超时时抛出exception。 不幸的是,根据官方文档,这种方法不适用于SslStream : SslStream假定当从内部流抛出一个IOException时,超时以及任何其他IOException将被其调用者视为致命的。 超时后重用SslStream实例将返回垃圾。 应用程序应该关闭SslStream并在这些情况下抛出exception。 [更新1]我尝试了一种不同的方法: task = stream->ReadAsync(buffer, 0, buffer->Length); if (task->Wait(timeout_ms)) { count = task->Result; … } 但是如果Wait()返回false则这不起作用:稍后再次调用ReadAsync()时会抛出exception: 抛出exception:System.dll Tests.exe中的“System.NotSupportedException”警告:0:从套接字读取失败:System.NotSupportedException:当另一个读取操作挂起时,无法调用BeginRead方法。 [更新2]我尝试了另一种通过在底层TcpClient套接字上调用Poll(timeout, …READ)来实现超时的TcpClient :如果它返回true ,则在SSlStream上调用Read() ,或者如果它返回false那么我们有一个超时。 这也不起作用:因为SslStream可能使用自己的内部中间缓冲区,即使在SslStream还有数据需要读取, Poll()也可以返回false 。 [更新3]另一种可能性是编写一个位于NetworkStream和SslStream之间的自定义Stream子类,捕获超时exception并返回0字节而不是SslStream 。 我不知道如何做到这一点,更重要的是,我不知道是否返回一个0字节读取到SslStream仍然不会以某种方式破坏它。 (*)我试图这样做的原因是,与非安全或安全套接字的超时同步读取是我已经在iOS,OS X,Linux和Android上用于某些跨平台代码的模式。 它适用于.NET中的非安全套接字,因此剩下的唯一情况是SslStream 。

你可以通过TcpClient发送比SendBufferSize更大的文件吗?

我正在尝试.NET中的Tcp连接,我想发送一些大于TcpClient对象的SendBufferSize比例的数据。 是否可以通过简单地写入网络流来发送数据,还是需要将其切换到pices并发送,然后在另一端创建它?

发送大于SendBufferSize的数据时,如何接收数据?

我刚刚问了一个关于如何发送大于SendBufferSize的数据的问题,答案是将在几个部分发送。 我的第二个问题是这些数据将如何收到? 它会在网络流中完成还是会被分割。 第一个问题: 你能发送一个比TcpClient更大的SendBufferSize文件吗?

直到什么时候NetworkStream.Write阻止?

我能想到这些可能的答案: 直到数据被写入IP堆栈中的某个内部缓冲区。 直到数据通过电线发送。 直到从其他机器收到确认接收为止。

在异步读取期间TcpClient断开连接

我有一些关于完成tcp连接的问题。 在使用listener.BeginAcceptTcpClient(ConnectionEstabilishedCallback, null);接受客户端后,客户端使用Tcp连接到我的服务器.BeginAcceptTcpClient listener.BeginAcceptTcpClient(ConnectionEstabilishedCallback, null); ,我开始用networkStream.BeginRead(….)阅读。 当我等待消息时客户端断开连接会发生什么? (例如,它失去了电力,互联网等) 我怎么知道它什么时候发生? 如果成功读取后,我会做一些事情,然后调用networkStream.Close(); client.Close(); networkStream.Close(); client.Close(); 客户会看到什么? 如何“优雅地”终止连接? 如果我正在等待读取(使用BeginRead),然后(在不同的线程上)关闭相同的流会发生什么? 编辑添加:我确实在客户端和服务器之间发生了乒乓消息。 够了吗? 如果我没有收到ping,请终止我的NetworkStream? 肯定有一些更好的东西。

为什么BufferedStream.Write会抛出“此流不支持搜索操作”?

这个让我困惑。 当我甚至没有打电话给我时,我得到一个关于寻求的错误? 我的代码看起来像这样: // send 42 uint value = 42; byte[] msg = BitConverter.GetBytes(value); stream.Write(msg, 0, sizeof(uint)); 我得到这个例外: System.NotSupportedException was unhandled Message=”This stream does not support seek operations.” Source=”System” StackTrace: at System.Net.Sockets.NetworkStream.Seek(Int64 offset, SeekOrigin origin) at System.IO.BufferedStream.FlushRead() at System.IO.BufferedStream.Write(Byte[] array, Int32 offset, Int32 count) … stream的类型为System.IO.BufferedStream 。 可能会发生什么? 编辑更多信息: 在这种情况下, sizeof(uint)==msg.length 。 流声明为stream = new […]