iOS如何仅通过蜂窝网络正确发送请求

时间:2016-07-27 03:54:19

标签: ios networking

我的问题显然是2例:

  • (1)仅通过wifi发送请求URL1
  • (2)仅通过手机发送请求URL2

我知道Reachability实用程序(Apple的代码和AFNetworking / Alamofire代码)和allowsCellularAccess属性(在NSMutableURLRequest和NSURLSessionConfiguration中)。

但这些只解决了案例(1)(因为我将allowsCellularAccess设置为NO)。 情况(2)未得到保证,因为请求可以通过蜂窝或wifi(如果可用)运行。即使我仅通过可达性检查蜂窝状态,仍有一些异常情况,如本文档中所述Restrict Cellular Networking Correctly

有没有更好的方法来确保蜂窝网络?任何建议都欢迎。 Object-C和Swift都受到欢迎。

先谢谢!

1 个答案:

答案 0 :(得分:2)

您可以使用IP_BOUND_IF:

在套接字中执行此操作
  1. 使用“ifaddrs.h”中包含的“getifaddrs”获取接口地址:
  2. struct ifaddrs *interfaces = NULL;
    struct ifaddrs *temp_addr = NULL;
    NSInteger success = getifaddrs(&interfaces);
    if (success == 0) {
        // Loop through linked list of interfaces
        temp_addr = interfaces;
        while(temp_addr != NULL) {
            if(temp_addr->ifa_addr->sa_family == AF_INET) {
                // Get NSString from C String
                NSString* ifaName = [NSString stringWithUTF8String:temp_addr->ifa_name];
                NSString* address = [NSString stringWithUTF8String:inet_ntoa(((struct sockaddr_in *) temp_addr->ifa_addr)->sin_addr)];
                NSString* mask = [NSString stringWithUTF8String:inet_ntoa(((struct sockaddr_in *) temp_addr->ifa_netmask)->sin_addr)];
                NSString* gateway = [NSString stringWithUTF8String:inet_ntoa(((struct sockaddr_in *) temp_addr->ifa_dstaddr)->sin_addr)];
                NSLog(@"%@;%@;%@;%@",ifaName,address,mask,gateway);
            }
            temp_addr = temp_addr->ifa_next;
        }
    }
    

    的 然后你会看到这样的输出:
    lo0的; 127.0.0.1; 255.0.0.0; 127.0.0.1
    pdp_ip0; 10.9.163.185; 255.255.255.255; 10.9.163.185
    EN0; 10.0.0.6; 255.255.0.0; 10.0.255.255

    (“pdp_ip0”表示纤维素界面)

    1. 在“net / if.h”中使用“if_nametoindex”,在“sys / socket.h”中使用“setsockopt”通过指定接口发送msg
    2. int s = socket(AF_INET, SOCK_STREAM, 0); 
      int index = if_nametoindex( "pdp_ip0");
      int suc = setsockopt(s, IPPROTO_IP, IP_BOUND_IF, &index, sizeof(index));
      

      然后连接套接字,您将看到已通过蜂窝接口连接服务器