2

背景

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

测试

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

我创建了一个小型测试应用程序,该应用程序启动一个线程,该线程发出绑定到特定适配器的 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;
  }
4

0 回答 0