C# .NET TcpClient重复设置收发超时与Connect超时异常相关疑问
C# .NET TcpClient重复设置收发超时与Connect超时异常相关疑问
嗨,这个问题问得特别准,我来给你把这几个点掰扯清楚:
首先你完全没猜错——TcpClient的SendTimeout和ReceiveTimeout确实和Connect方法一点关系都没有!这两个属性只负责管控连接建立之后,调用Send/Receive(或者通过NetworkStream读写数据)时的超时时间,对TCP握手阶段的连接过程完全不起作用。所以你遇到的SocketError.TimedOut异常,肯定和这两次设置的超时值没关系,就是连接阶段本身超时了。
那为什么原代码要重复设置这两个超时呢?大概率是这几种情况:
- 原代码作者一开始对TcpClient的超时机制有误解,以为设置了能影响
Connect,结果发现没用,就又在Connect后改了个更大的值,但没删掉之前的初始化代码,留了冗余; - 也可能是代码迭代过程中,不同的人调整过超时参数,没做好代码清理,导致重复设置;
- 极端点说,说不定有人误以为“Connect前设置的超时不会生效,必须连接后再覆写”——但实际上不管是Connect前还是后设置,只要在收发操作前生效就没问题,重复设置纯粹是多此一举。
再说说Connect超时的正确控制方式:TcpClient直接传host和port的Connect重载,用的是系统默认的TCP连接超时(一般是几十秒),如果要自定义这个超时,不能靠Send/ReceiveTimeout,得用这些方法:
- 如果是.NET 5及以上版本,直接用
ConnectAsync带CancellationToken的重载,配合Task.Delay来实现超时取消; - 老版本的话,可以手动用
Socket的BeginConnect/EndConnect异步方式,或者把ConnectAsync和Task.WhenAny结合,到时间就取消连接。
你贴的这段代码里还有个小笔误(变量名从client变成tcpClient),其中的重复设置完全是冗余操作,直接优化成这样就行:
// 直接初始化时设置最终需要的超时值,或者Connect后设置一次即可 var client = new TcpClient { SendTimeout = 20000, ReceiveTimeout = 20000 }; client.Connect(hostName, port); client.Client.Send(someByteArray);
内容来源于stack exchange
相关产品推荐
相关产品推荐

