ios - 使用静态 IP 的 WIFI 连接不会调用 kCFSocketAcceptCallBack

标签 ios xcode networking ip

我会尽力做到详细。我正在尝试在应用程序中从 iPhone 连接到采集单元。我们使用的是 IP4,采集单元不支持 DHCP,因此它始终扫描具有特定静态 IP 和端口号的设备。

在测试设备和 iPhone 之间的连接之前,我使用桌面创建了一个临时网络,并在 iPhone 上进行了尝试。这是我的代码的一部分。

CFSocketContext CTX = { 0, description, NULL, NULL, NULL };
/* Create the server socket as a TCP IPv4 socket and set a callback */
/* for calls to the socket's lower-level accept() function */
TCPServer = CFSocketCreate(NULL, PF_INET, SOCK_STREAM, IPPROTO_TCP,
                           kCFSocketAcceptCallBack
                           , (CFSocketCallBack)WiFiCallBack, &CTX);
    /* Set the port and address we want to listen on */
struct sockaddr_in addr;
memset(&addr, 0, sizeof(addr));
addr.sin_len = sizeof(addr);
addr.sin_family = AF_INET;
addr.sin_port = htons(PORT);
addr.sin_addr.s_addr = htonl(INADDR_ANY);

CFDataRef addressData = CFDataCreate( NULL, (UInt8*)(&addr), sizeof( struct sockaddr_in )      );
CFSocketSetAddress(TCPServer, addressData);

它可以工作,如果我将分配给 iPhone 的 IP 输入到桌面上的 PC 应用程序,我可以在桌面和 iPhone 之间进行数据传输。但是,如果我为 iPhone 设置静态 IP 并尝试让 PC 应用程序连接到具有该 IP 的任何设备,则无法正常工作。

我的采集单元也是如此。回调函数根本没有被调用。

我迫切需要帮助,因此欢迎任何形式的帮助。谢谢。

最佳答案

抱歉,您的帖子不太清楚。

您是否正在尝试在 iPhone 上建立服务器套接字,并从其他地方连接到它?

由于多种原因,这将会成为问题。

首先,您的 IP 不会相同。当连接到WIFI时,您将拥有一个至少在当前网络上可路由的IP。

但是当连接到 3g(或 lte 等)时,您可能根本无法路由到给定的 IP。

即使您确实在某个存在足够长的接口(interface)上拥有完全可路由的 IP 地址,iOS 也不是为此设计的。您的应用程序将无法在后台有效运行并监听服务器套接字。您可以使用持久套接字和 voip 后台模式来模拟这一点。然而,这需要一个单独的服务器组件。

您也可以尝试从 iPhone 进行轮询,这可能会满足您的要求。

关于ios - 使用静态 IP 的 WIFI 连接不会调用 kCFSocketAcceptCallBack,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13537968/

相关文章:

ios - 静态渐变图像与 CAGradientLayer?

css - 如何避免iOS自动调整字体大小?

c++ - 使用 Xcode 为 macOS 构建时,C++ async 是否使用线程池?

ios - 属性不可用警告

ruby-on-rails - 如何在 Chrome 浏览器中查看在机器上的本地主机中运行的网站?

ios - 使用 dequeueReusableCellWithIdentifier 时保留单元格之间的单元格属性

ios - Swift:string.characters.count 为阿拉伯字符串返回错误的数字

swift - 在 Xcode 模拟器上运行预览

c++ - 如何在 C++ 中获取所有网络接口(interface)名称和信息

networking - 如果计算机名称以破折号 "-"开头,如何 ping 计算机