我有一个应用程序正在监听来自大约 30 辆汽车中调制解调器的消息。我使用 TcpListener 来实现如下所示的服务器代码(省略了错误处理):
...
listener.Start()
...
void
BeginAcceptTcpClient()
{
if(listener.Server.IsBound) {
listener.BeginAcceptTcpClient(TcpClientAccepted, null);
}
}
void
TcpClientAccepted(IAsyncResult ar)
{
var buffer = new byte[bufferSize];
BeginAcceptTcpClient();
using(var client = EndAcceptTcpClient(ar)) {
using(var stream = client.GetStream()) {
var count = 0;
while((count = stream.Read(buffer, total, bufferSize - total)) > 0) {
total += count;
}
}
DoSomething(buffer)
}
我正确收到消息,我的问题在于断开连接。每 12 小时调制解调器重置并获得一个新的 IP 地址,但服务器继续保持旧连接处于活动状态(它们在 tcpview 中标记为 ESTABLISHED)。有没有办法为旧连接设置超时?我认为通过关闭 TcpClient 来关闭 TCP 连接(这就是在我的本地测试中发生的情况),我做错了什么?