.Net Socket 不响应远程断开连接?

2023-12-01

我正在编写一个小型 (C#) 客户端应用程序,该应用程序使用 TCP/IP 连接将数据发送到远程服务器。我正在使用标准 .Net TcpClient 对象,并且希望在客户端保持连接打开状态,因为我定期向服务器提交数据包。但是,服务器可能会关闭连接,在这种情况下,我需要知道在发送下一个数据包之前重新连接。

使用 Wireshark,当服务器终止连接时,我(仅)可以看到以下对话:

server >>> FIN, ACK
                ACK <<< client

我做什么not看到我的客户端用它自己的 FIN 进行响应,以完成连接关闭。结果是我的客户端程序在发送下一个数据包后才发现连接断开了。

有什么方法可以设置 TcpClient 或其底层 Socket 以完成断开连接,并提供一些反馈,以便我的客户端代码知道在发送下一个数据包之前重新连接?

Added回应以下评论: 我的发送代码非常简单 - 维护 TcpClient 和 NetworkStream 成员变量的对象有一个包含(本质上)以下内容的成员函数:

bool sent = false;
byte[] buffer = Encoding.UTF8.GetBytes(dataString);
while (!sent)
{
    try
    {
        m_outStream.Write(buffer, 0, buffer.Length);
        sent = true;
    }
    catch (Exception ex)
    {
        if (m_outStream != null) { m_outStream.Dispose(); }
        m_client = new TcpClient(AddressFamily.InterNetwork);
        m_client.Connect(ipAddress, ipPort);
        m_outStream = m_client.GetStream();
    }
}

当 m_client 和 m_outStream 初始化后,每次只执行一次。然后使用 Wireshark 我可以看到服务器发送带有标志的数据包FIN, ACK客户回应ACK.

下次我调用我的函数时,数据将被发送出去PSH, ACK,服务器响应RST, ACK但不读取传入的数据。客户没有提出任何异常。

然后我第二次调用我的函数,并引发异常,导致连接重新启动。


一般来说,您应该能够使用Connected财产在TcpCient实例:

看这里:
http://msdn.microsoft.com/en-us/library/system.net.sockets.tcpclient.connected.aspx

However:

因为 Connected 属性只反映了 从最近一次操作开始的连接,您应该尝试发送 或接收消息以确定当前状态。留言后 发送失败,该属性不再返回 true。请注意,这 行为是设计使然的。您无法可靠地测试该状态 连接,因为在测试和发送/接收之间的时间内, 连接可能已丢失。您的代码应该假设 套接字已连接,并优雅地处理失败的传输。

请尝试以下操作以确保Connected标志保持最新状态:

var tcpClient = new TcpClient ();
tcpClient.Connect();

var stream = tcpClient.GetStream();

// buffer size need to be > 0
int[] buffer = new int[1];
stream.Read(buffer, 0, 0);

if(!tcpClient.Connected)
    // do something

根据反编译,应该可以读取0来自流的字节,至少 .NET Framework 中没有检查TcpClient这可以防止这种情况发生。但是,它可能不会在从框架调用以实际从网络流中读取的外部代码中大声显示。

务必Dispose两者的TcpClientStream完成后,处置TcpClient不处置Stream所以你需要手动执行此操作,之后所有资源都被释放(GC之后)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

.Net Socket 不响应远程断开连接? 的相关文章

  • 在 Java 中创建 T 的新实例

    在C 中 我们可以定义一个泛型class A
  • 删除是如何工作的? [复制]

    这个问题在这里已经有答案了 可能的重复 C 编程 free 如何知道要释放多少 https stackoverflow com questions 1518711 c programming how does free know how m
  • 解析 JWT 令牌以仅获取有效负载内容,无需 C# 或 Blazor 中的外部库

    我正在使用 Blazor 编写可以访问 JWT 的客户端应用程序 我想知道一种简单的方法来读取令牌有效负载内容而不添加额外的依赖项 因为我不需要其他信息 也不需要验证令牌 我认为解析有效负载内容应该足够简单 只需将其写入方法即可 JwtTo
  • 是否存在指向不同类型的指针具有不同大小的平台?

    C 标准允许指向不同类型的指针具有不同的大小 例如sizeof char sizeof int 是允许的 但是 它确实要求如果将指针转换为void 然后转换回其原始类型 它必须与其原始值进行比较 因此 从逻辑上来说 sizeof void
  • 检测到堆栈崩溃

    我正在执行我的 a out 文件 执行后 程序运行一段时间 然后退出并显示消息 stack smashing detected a out terminated Backtrace lib tls i686 cmov libc so 6 f
  • 如何制作可启动程序?

    所以 这个问题可能看起来很奇怪 但假设我编译了 int main void int x 3 int y 4 int z x y 是否可以让CPU这样运行 如何 例如 这允许我写入监视器吗 如果我没记错的话 内存中有些地方可以写入要显示的内容
  • 计算另一个表达式中的 C# 表达式

    我想在另一个表达式中使用一个表达式 Expression
  • 一元 +/- 运算符如何可能导致“-a”或“+a”中的整数提升,“a”是算术数据类型常量/变量?

    这句看似微不足道的台词摘自我的迈克 巴纳汉和布雷迪的 C 书 第 2 8 8 2 节 http publications gbdirect co uk c book chapter2 expressions and arithmetic h
  • 获取 boost Spirit 语法中的当前行

    我正在尝试使用 boostspirit 获取正在解析的文件的当前行 我创建了一个语法类和结构来解析我的命令 我还想跟踪在哪一行找到命令并将其解析到我的结构中 我将 istream 文件迭代器包装在 multi pass 迭代器中 然后将其包
  • 从BackgroundWorker线程更新图像UI属性

    在我正在编写的 WPF 应用程序中 我有一个 TransformedBitmap 属性 该属性绑定到 UI 上的 Image 对象 每当我更改此属性时 图像就会更新 因此显示在屏幕上的图像也会更新 为了防止在检索下一张图像时 UI 冻结或变
  • 如何从 Rx Subscribe 回调异步函数?

    我想回调 Rx 订阅中的异步函数 例如 像那样 public class Consumer private readonly Service service new Service public ReplaySubject
  • 英文日期差异

    接近重复 如何计算相对时间 https stackoverflow com questions 11 how do i calculate relative time 如何在 C 中计算某人的年龄 https stackoverflow c
  • Linux mremap 不释放旧映射?

    我需要一种方法将页面从一个虚拟地址范围复制到另一个虚拟地址范围 而无需实际复制数据 范围很大 延迟很重要 mremap 可以做到这一点 但问题是它也会删除旧的映射 由于我需要在多线程环境中执行此操作 因此我需要旧映射能够同时使用 因此稍后当
  • ASP.NET MVC 路由:如何从 URL 中省略“索引”

    我有一个名为 StuffController 的控制器 具有无参数索引操作 我希望从表单中的 URL 调用此操作mysite com stuff 我的控制器定义为 public class StuffController BaseContr
  • 逆向工程 ASP.NET Web 应用程序

    我有一个 ASP NET Web 应用程序 我没有源代码 该 bin 包含 10 个程序集和一个 compiled 文件 我在 App Code dll 上使用 Reflector 它向我显示了类和命名空间之类的东西 但它太混乱了 有没有什
  • CUDA 8 编译错误 -std=gnu++11

    我正在尝试转换一些代码以使用 CUDA 并且我认为我遇到了兼容性问题 我们使用CMake 这些是我使用的 gcc 和 CUDA 版本 gcc version gcc Ubuntu 5 4 0 6ubuntu1 16 04 5 5 4 0 2
  • 需要提取字符串中点后的最后一个数字,如“7.8.9.1.5.1.100”

    我需要提取 C 字符串中最后一个点后面的最后一个数字 例如 7 8 9 1 5 1 100 并将其存储在整数中 Added 该字符串也可以是 7 8 9 1 5 1 1 或 7 8 9 1 5 1 0 我还想验证它在最后一个点之前恰好是 7
  • 通过 Tab 键浏览 XML 文档字段

    In VB NET you can move through the fields in the XML member documentation with the Tab key 这在 C 中不起作用 还有其他方法吗 除了用鼠标将光标放在
  • 结构化绑定的用例有哪些?

    C 17 标准引入了新的结构化绑定 http en cppreference com w cpp language structured binding功能 最初是proposed http www open std org jtc1 sc
  • 使用未分配的局部变量

    我遇到了一个错误 尽管声明了变量 failturetext 和 userName 错误仍然出现 谁能帮帮我吗 Use of Unassigned local variable FailureText Use of Unassigned lo

随机推荐

  • 反序列化 List 对象

    我正在尝试将 XML 反序列化为对象 但我陷入了一种情况 任何人都可以帮我吗 XML
  • 保存为 JPEG with Pillow 的图像与原始图像不同。

    我有一个 3 d numpy 数组 并使用 Pillow 将其保存为 JPEG 图像 当我使用 Pillow 重新加载图像时 生成的 numpy 数组有所不同 我为此编写了一个演示代码 from PIL import Image impor
  • 将开始和结束锚标记之间的字符串替换为其他字符串

    我需要用其他字符串替换一对锚标记之间的字符串 更清楚地说 a Click Here a 我想更换 点击这里 与 img src 标签 我阅读了一些其他资源 尝试了 Lars Olav Torvik 的正则表达式工具 但严重失败 请帮帮我 不
  • 如何基于分段控件和添加按钮切换到 2 个视图?

    我在导航控制器的标头中有一个分段控件 我想将一个对象添加到也在该导航控制器中的表视图控制器中 这就是我的问题所在 如何从一个 UIButton 切换到 2 个视图中的 1 个 即每个分段控件选项的不同添加视图 您只能从故事板中的 UIBar
  • Excel 将 URL 转换为图像 (1004)

    我有一个链接到 SQL 数据库的 Excel 文档 其中包含几列图像 URL One of those URLs looks like this https imissit blob core windows net iris 596480
  • 将两个字符串作为数值进行比较

    我应该如何比较 C 中表示数字的两个字符串 我想转换为数量long longtype 但问题是 string 表示的数值可以超过long long最大限制 保证该字符串代表一个数值 Java中也有类似的问题比较两个数字字符串值 但这利用了
  • 如何将变量转换为json?

    我想将json数据发送到ajax 但是如何将变量转换为json或将数组转换为json confirm order click function event event preventDefault var street street val
  • 如何跨线程共享包含 Sender 和 Receiver 字段的结构?

    我有一个结构 大致如下所示 struct Node id Arc
  • 程序从windows启动? C#

    So 我已经构建了一个只需打开一个新程序的winforms winform中的代码是这样的 如果有人需要 Process a Process a Process Start notepad exe BUT 我需要知道如何让程序随 Windo
  • 整数数组中具有最大总和的子序列[重复]

    这个问题在这里已经有答案了 给定一个整数数组 如何找到两个索引 i 和 j 使得子数组中从索引开始和结束的元素之和最大化 在线性时间内 简单的 假设你得到了数组a 首先 计算数组s where s i a 0 a 1 a i 您可以在线性时
  • 添加按钮到 QVideoWidget

    每个人 我尝试为 QMediaPlayer 元素设置点击属性 但我找不到制作它的模式 如果我尝试将按钮放在视频前面 该按钮会放在视频后面 即使使用 button gt raise videoWidget gt lower 如果我按下按钮全屏
  • 如何在没有 2^n if 语句的情况下启动具有许多布尔参数的函数模板

    我有一个 CUDA C 代码 专门出于性能原因而使用函数模板 这样该函数将只执行它需要执行的操作 而不是不断加载和读取布尔值来检查它是否需要执行操作 所有模板参数都是布尔值 在启动内核时 CPU 检查布尔值并启动适当的 我相信这称为内核模板
  • SQL Server 插入缺失行

    我有下表记录每天的值 问题是有时会缺少几天 我想编写一个 SQL 查询来 归还缺失的日子 使用线性插值计算缺失值 所以从下面的源表中可以看出 Date Value 2010 01 10 10 2010 01 11 15 2010 01 13
  • 将 C# 中的 CPU ID 代码转换为 C++ 中的 CPU ID 代码

    我有这个 C 代码来获取处理器 ID 但我无法将其传递给 C 我尝试了很多 但我真的不能 我刚刚开始使用 C 我希望能够通过以下方式获取 CPU ID C 就像我以前使用 C 一样 这是我在 C 中的代码 public static str
  • 嵌套列表理解以展平嵌套列表

    我对 Python 很陌生 想知道如何使用列表理解来展平以下嵌套列表 并使用条件逻辑 nested list 1 2 3 4 5 6 7 8 9 以下返回一个嵌套列表 但是当我尝试通过删除内部方括号来展平列表时 出现错误 odds even
  • Django 1.7 - makemigrations 未检测到更改

    正如标题所示 我似乎无法进行迁移 该应用程序最初低于 1 6 所以我知道迁移最初不会存在 事实上 如果我运行python manage py migrate I get Operations to perform Synchronize u
  • 如何从 Firefox 扩展程序访问网页数据?

    我已经成功地在 Firefox 中运行了一个自定义的非常基本的扩展 接下来我想做的是 检查用户是否位于所需的网页上 如果是 检查每个回发的页面是否包含包含string 如果找到 启动外部应用程序string范围 我对网页上的 javascr
  • pandas to_sql 方法给出日期列错误

    我有一个如下所示的数据框 df pd DataFrame index pd date range 2014 01 01 periods 10 df date df index map lambda x x strftime d m Y df
  • 预期为“struct Matrix_t *”,但参数类型为“struct Matrix_t *”?_?没有不同

    main c 78 25 erreur assignment from incompatible pointer type Werror main c 81 9 erreur passing argument 2 of matrix mul
  • .Net Socket 不响应远程断开连接?

    我正在编写一个小型 C 客户端应用程序 该应用程序使用 TCP IP 连接将数据发送到远程服务器 我正在使用标准 Net TcpClient 对象 并且希望在客户端保持连接打开状态 因为我定期向服务器提交数据包 但是 服务器可能会关闭连接