C# 中NetworkStream类Read函数导致程序死机的问题

 

网络编程分为阻塞和非阻塞两种方式,如果选择了阻塞方式进行编程,控制不好很容易导致程序死掉。

 

networkStream = tcpClient.GetStream();

networkStream.ReadTimeout = 10000; // 设置读取超时时间为10秒

networkStream.WriteTimeout = 10000; // 设置写入超时时间为10秒

如果去掉networkStream.ReadTimeout = 10000;和networkStream.WriteTimeout = 10000;两行,程序就有可能在

readBytes = networkStream.Read(recvBuff, 0, recvBuff.Length);处死掉

(笔者在调试到此时将网线拔掉,发现程序就会死在这里,即使网络恢复了程序也不会恢复)。

查看MSDN中关于NetworkStream类的帮助信息,发现ReadTimeout和WriteTimeout属性的默认值都是Infinite(无限),即永不超时,所以networkStream.Read在读不到数时就永远不会返回,也不会产生任何的exception。


参考:

https://blog.csdn.net/kjlrzzyffmx/article/details/49024251

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的 C# TCP 通信的程序,其包含了客户端和服务器端的代码。 服务器端代码: ```C# using System; using System.Net; using System.Net.Sockets; using System.Text; namespace TCPServer { class Program { static void Main(string[] args) { IPAddress ipAddress = IPAddress.Parse("127.0.0.1"); int port = 8888; TcpListener serverSocket = new TcpListener(ipAddress, port); TcpClient clientSocket = default(TcpClient); serverSocket.Start(); Console.WriteLine(" >> Server Started"); while (true) { clientSocket = serverSocket.AcceptTcpClient(); Console.WriteLine(" >> Accept connection from client"); NetworkStream networkStream = clientSocket.GetStream(); byte[] bytesFrom = new byte[10025]; networkStream.Read(bytesFrom, 0, (int)clientSocket.ReceiveBufferSize); string dataFromClient = Encoding.ASCII.GetString(bytesFrom); dataFromClient = dataFromClient.Substring(0, dataFromClient.IndexOf("$")); Console.WriteLine(" >> Data from client - " + dataFromClient); string serverResponse = "Last Message from client - " + dataFromClient; Byte[] sendBytes = Encoding.ASCII.GetBytes(serverResponse); networkStream.Write(sendBytes, 0, sendBytes.Length); networkStream.Flush(); Console.WriteLine(" >> " + serverResponse); } clientSocket.Close(); serverSocket.Stop(); Console.WriteLine(" >> exit"); Console.ReadLine(); } } } ``` 客户端代码: ```C# using System; using System.Net.Sockets; using System.Text; namespace TCPClient { class Program { static void Main(string[] args) { try { TcpClient clientSocket = new TcpClient(); clientSocket.Connect("127.0.0.1", 8888); Console.WriteLine(" >> Client Started"); string message = "Hello Server!"; Byte[] sendBytes = Encoding.ASCII.GetBytes(message); NetworkStream networkStream = clientSocket.GetStream(); networkStream.Write(sendBytes, 0, sendBytes.Length); networkStream.Flush(); byte[] bytesFrom = new byte[10025]; networkStream.Read(bytesFrom, 0, (int)clientSocket.ReceiveBufferSize); string dataFromServer = Encoding.ASCII.GetString(bytesFrom); dataFromServer = dataFromServer.Substring(0, dataFromServer.IndexOf("$")); Console.WriteLine(" >> Data from server - " + dataFromServer); networkStream.Flush(); clientSocket.Close(); Console.WriteLine(" >> exit"); Console.ReadLine(); } catch (Exception ex) { Console.WriteLine(" >> " + ex.ToString()); } } } } ``` 在运行这个程序之前,需要先运行服务器端程序,然后再运行客户端程序。在成功运行之后,客户端将会发送消息“Hello Server!”给服务器端,然后服务器端会将消息原样发送回客户端。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值