将 Web 请求绑定到特定网络适配器

2024-01-07

背景

我有一个带有 2 个网络适配器的移动嵌入式设备 (Ubuntu/Mono)。一种是WiFi,另一种是GSM。要求是当WiFi适配器连接到互联网时(在预定AP的范围内),应用程序上传数据(HTTPS 发布)通过 WiFi,但当 WiFi 不可用但 GSM 可用时,它会通过 GSM 链路上传数据。

Testing

为了实现这一目标,我创建了一个基于云的 Web 服务,如果您向它发出 HTTP GET,该服务将返回 OK。这个想法是让一个线程定期发出绑定到特定适配器的 GET 请求并检查结果。 “正常”结果表示适配器已连接到互联网,而超时通常表示未连接到互联网。然后我可以使用它来确定使用哪个适配器来处理请求。

我创建了一个小型测试应用程序,它启动一个线程,发出绑定到特定适配器的 GET 请求。我使用 request.BindIPEndPointDelegate 将请求绑定到适配器。当我在 WiFi 适配器上运行该应用程序时,结果符合预期。当 WiFi AP 打开时,请求返回 OK,当 AP 关闭时,请求超时。当我在 GSM 适配器上运行应用程序时也是如此。

但是,当我更新应用程序以启动 2 个线程(一个用于 WiFi 适配器和 GSM 适配器)时,出现问题。当 AP 打开时,WiFi 和 GSM 请求会顺利进行。当我关闭 AP 时,WiFi 请求最初超时,但一段时间后返回成功结果,这是错误的。因为两个线程的 URI 相同,所以我怀疑 ServicePointManager 将相同的 ServicePoint 返回给两个线程,并且由于多线程,这会变得混乱。

下一个测试是创建 2 个不同的端点。 WiFi 和 GSM 请求各一个,希望 ServicePointManager 始终返回不同的 ServicePoint。不幸的是,这没有产生积极的影响。

我将不胜感激的建议。

代码如下:

  private HttpWebRequest CreateRequest(Uri webApiUri,IPAddress adapterAddress)
  {
   IPEndPoint endPoint = new IPEndPoint(adapterAddress, 0);

   HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(webApiUri);

   webRequest.ServicePoint.BindIPEndPointDelegate =
      delegate(ServicePoint servicePoint, IPEndPoint remoteEndPoint, int retryCount)
      {
         if (retryCount == 1)
          throw new WebException(string.Format("Cannot bind to adapter {0}", endPoint));

        return endPoint;
      };

    return webRequest;
  }

None

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

将 Web 请求绑定到特定网络适配器 的相关文章

随机推荐

  • 使用 Python 从文本中提取 IBAN

    我想用 Python 从文本中提取 IBAN 号码 这里的挑战是 IBAN 本身可以用多种方式编写 数字之间有空格 我发现很难将其转换为有用的正则表达式模式 我写了一个演示版 https regex101 com r PRDDaT 1它尝试
  • 使用 LINQ 进行编码是如何工作的?幕后发生了什么?

    例如 m lottTorqueTools From t In m lottTorqueTools Where Not t SlotNumber toolTuple SlotNumber And Not t StationIndex tool
  • java.lang.RuntimeException: android.database.sqlite.SQLiteException: 没有这样的表: media_store_extension (代码 1): ,

    我在 2021 年 10 月之后在 Play 商店上发布我的应用程序时遇到问题 错误表明该表media store extension不存在 问题是 我在项目中没有使用 SQLITE 所以我不知道是什么导致了这个异常 目标 sdk 是 30
  • 当单词不存在时,将 0 分配给某些单词

    这是我在 stackoverflow 上发表的第一篇文章 我对编码还比较陌生 所以 请耐心听我说 我正在做一个实验 有两组数据文档 文档1如下 TOPIC topic 0 5892 0 site 0 0371690427699 Intern
  • GLSL 着色器:在两个以上纹理之间进行插值

    我已经在 OpenGL 中实现了高度图 目前它只是一个正弦 余弦弯曲地形 目前我正在白色的 冰 和较暗的 石头 纹理之间进行插值 这是这样完成的 color mix texture2D ice layer tex texcoord text
  • 如何从给定的父节点获取所有子节点?

    我有一个父 子 ID 列表 并且希望获取给定父 ID 的所有子 ID 不存在空父级 顶级 ID 不会显示为子 ID 目前 父 子 ID 被记录为列表中的 KeyValuePair 但是如果更好的话 可以轻松更改为其他数据结构 List
  • aspnet 的最大值:MaxHttpCollectionKeys

    我有一个发布相当大数据的表单 但出现此错误 InvalidOperationException Operation is not valid due to the current state of the object System Web
  • JPanel 错误 - J 组件无法解析

    我有 JRE 系统库 JRE 1 8 x 库 我的线路出现错误 错误 无法解析类型 javax swing JComponent 它是从所需的 class 文件间接引用的 我怎样才能消除这个错误 这是屏幕截图 http i60 tinypi
  • 框架的私有模块映射

    我在用着这个答案 https stackoverflow com a 25250520 849645创建模块映射来为 CommonCrypto 创建模块 以便我可以在框架中使用它 然而 这样做意味着我使用此框架的任何项目都可以通过以下方式访
  • .NET 4.5 文件读取性能同步与异步

    我们正在尝试测量使用同步方法与异步方法读取一系列文件之间的性能 原本期望两者之间的时间大致相同 但结果发现使用异步大约慢 5 5 倍 这可能是由于管理线程的开销造成的 但只是想知道您的意见 也许我们只是测量了错误的时间 这些是正在测试的方法
  • 使用 INDEX/MATCH 进行三维查找

    这是从已被删除的问题中采取并稍微改进的 对于那些可以看到已删除帖子的人 该帖子摘自此处 https stackoverflow com questions 39793322 Three Dimensional lookup no conca
  • Spring REST - 创建 ZIP 文件并将其发送到客户端

    我想创建一个 ZIP 文件 其中包含从后端收到的存档文件 然后将此文件发送给用户 两天来我一直在寻找答案 但找不到合适的解决方案 也许你可以帮助我 目前 代码是这样的 我知道我不应该在 Spring 控制器中完成所有操作 但不要关心这一点
  • 如何在 Java GridLayout 中使用边距和填充

    如何防止 JLabel 显示与框架侧面齐平 我在使用 GridLayout 或 BoxLayout 时遇到同样的问题 这是发生这种情况的示例 JPanel content new JPanel content setLayout new B
  • 导入角度组件以在所有模块中可用

    我最近开始使用 Angular 2 到目前为止我的体验非常棒 我有一些很好的经验ng1 and React以及 所以 这更像是一个普遍问题 也是一个困惑 我很确定这会帮助很多其他人 但我还没有真正找到任何直接的答案 所以假设我有这个modu
  • 实体框架重复对象和所有子属性

    结构示例 public class Page public int PageId get set public string Prop1 get set public string Prop2 get set public virtual
  • Codeigniter:语言文件中的变量/配置项

    我有一个语言文件 其中包含一长串用于我的视图文件的字符串 我的问题是如何将变量或配置项传递到语言文件
  • “const id”的行为

    我正在研究 99 Haskell 问题 并看到了查找列表最后一个元素的解决方案 myLast foldr1 const id 的类型const is a gt b gt a但那个const id is b gt a gt a那么这里有什么魔
  • Build.gradle:对“项目”的访问超出了其访问权限

    常量 gradle project ext minSdkVersion 19 compileSdkVersion 28 targetSdkVersion 28 buildToolsVersion 28 0 3 supportLibraryV
  • 在 boost 中等待多个条件变量?

    我正在寻找一种等待多个条件变量的方法 IE 就像是 boost condition variable cond1 boost condition variable cond2 void wait for data to process bo
  • 将 Web 请求绑定到特定网络适配器

    背景 我有一个带有 2 个网络适配器的移动嵌入式设备 Ubuntu Mono 一种是WiFi 另一种是GSM 要求是当WiFi适配器连接到互联网时 在预定AP的范围内 应用程序上传数据 HTTPS 发布 通过 WiFi 但当 WiFi 不可