Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用charlesproxy检查iOS模拟器/设备的websocket流量_Ios_Sockets_Websocket_Charles Proxy_Cfnetwork - Fatal编程技术网

如何使用charlesproxy检查iOS模拟器/设备的websocket流量

如何使用charlesproxy检查iOS模拟器/设备的websocket流量,ios,sockets,websocket,charles-proxy,cfnetwork,Ios,Sockets,Websocket,Charles Proxy,Cfnetwork,我想检查通过web套接字的网络流量,我无法控制网络代码,因为这是一个二进制库,我没有源代码,因此我无法在代码的网络部分执行任何日志/断点 我尝试过使用最新版本的charlesproy,它声称能够嗅探websockets,但是当我尝试使用websockets的url和api时,我的iPhone调用的端点列表中甚至没有提到 我已经验证了CharlesProxy的配置是否正确,因为即使在SSL下,我也能够检查非websocket流量 所以我的问题是:有没有人找到了一个解决方案,用CharlesPro

我想检查通过web套接字的网络流量,我无法控制网络代码,因为这是一个二进制库,我没有源代码,因此我无法在代码的网络部分执行任何日志/断点

我尝试过使用最新版本的charlesproy,它声称能够嗅探websockets,但是当我尝试使用websockets的url和api时,我的iPhone调用的端点列表中甚至没有提到

我已经验证了CharlesProxy的配置是否正确,因为即使在SSL下,我也能够检查非websocket流量

所以我的问题是:有没有人找到了一个解决方案,用CharlesProxy检查通过WebSocket的流量

注意:我在使用iOS9时禁用了ATS


谢谢

我终于找到了答案

Charles 3.11.2与WebSocket完美配合。

我使用,所以我已经看到在协商阶段发送的http请求,但是我错过了WebSocket流量。

在一开始,socketIO尝试使用轮询,然后使用交换机来使用WebSocket

当您转到状态为“Sending request body”的请求时,websocket流量是可见的,该请求实际上是wss://请求

你甚至有一个专门的标签来处理这种流量。其余消息将显示在此处

PS1。确保您已正确连接到插座,然后它将显示在Charles中。

PS2。我建议使用socketIO,这是对websockets这样的全双工通信的极大增强

更新:socket.io-client-swift v15.1.0现在正确支持SOCKS代理。我还没有尝试过,但这意味着不再需要对红蜘蛛进行手动编辑


接受的答案似乎不适用于iOS设备上的Socket.IO

最新版本的Socket.IO-Client-Swift(撰写本文时为15.0.0)用于iOS/OS X上的WebSocket

好消息是红蜘蛛支持袜子代理,但是:

  • IO不公开红蜘蛛websocket,也不提供任何API来启用SOCKS代理行为

  • 红蜘蛛内置的SOCKS代理使用OS SOCKS代理设置,设置起来很麻烦(至少对于iOS而言)

  • 如果我有时间的话,我可能会提议一个公关来更彻底地解决这个问题,但考虑到红蜘蛛和Socket.IO-Client-Swift都需要工作,这并不完全是简单的

    为了临时调试的目的(这是Charles的用例!)绕过此问题的最简单方法是编辑
    WebSocket.swift
    文件作为红蜘蛛的一部分,并替换此代码:

    if enableSOCKSProxy {
        let proxyDict = CFNetworkCopySystemProxySettings()
        let socksConfig = CFDictionaryCreateMutableCopy(nil, 0, proxyDict!.takeRetainedValue())
        let propertyKey = CFStreamPropertyKey(rawValue: kCFStreamPropertySOCKSProxy)
        CFWriteStreamSetProperty(outputStream, propertyKey, socksConfig)
        CFReadStreamSetProperty(inputStream, propertyKey, socksConfig)
    }
    
    let socksConfig = CFDictionaryCreateMutableCopy(nil, 0, CFNetworkCopySystemProxySettings()!.takeRetainedValue()) as! [String: Any]
    let propertyKey = CFStreamPropertyKey(rawValue: kCFStreamPropertySOCKSProxy)
    let ip = socksConfig["HTTPSProxy"]
    let proxySocksConfig = ["SOCKSProxy": ip, "SOCKSPort": 8889, "SOCKSEnable": true] as CFDictionary // Where 8889 is the SOCKS proxy port in Charles
    CFWriteStreamSetProperty(outputStream, propertyKey, proxySocksConfig)
    CFReadStreamSetProperty(inputStream, propertyKey, proxySocksConfig)
    
    使用此代码:

    if enableSOCKSProxy {
        let proxyDict = CFNetworkCopySystemProxySettings()
        let socksConfig = CFDictionaryCreateMutableCopy(nil, 0, proxyDict!.takeRetainedValue())
        let propertyKey = CFStreamPropertyKey(rawValue: kCFStreamPropertySOCKSProxy)
        CFWriteStreamSetProperty(outputStream, propertyKey, socksConfig)
        CFReadStreamSetProperty(inputStream, propertyKey, socksConfig)
    }
    
    let socksConfig = CFDictionaryCreateMutableCopy(nil, 0, CFNetworkCopySystemProxySettings()!.takeRetainedValue()) as! [String: Any]
    let propertyKey = CFStreamPropertyKey(rawValue: kCFStreamPropertySOCKSProxy)
    let ip = socksConfig["HTTPSProxy"]
    let proxySocksConfig = ["SOCKSProxy": ip, "SOCKSPort": 8889, "SOCKSEnable": true] as CFDictionary // Where 8889 is the SOCKS proxy port in Charles
    CFWriteStreamSetProperty(outputStream, propertyKey, proxySocksConfig)
    CFReadStreamSetProperty(inputStream, propertyKey, proxySocksConfig)
    
    这将确保默认情况下启用SOCKS代理,并通过Charles路由所有WebSocket流量


    然后,您需要确保在iOS中配置HTTP代理设置(因为相同的IP将用于HTTP和SOCKS),在Charles中启用SOCKS代理,并且端口与上面代码中的端口匹配(默认为8889)。

    感谢您非常有用的回答Jonathan Ellis! 我用的是Pusher,效果很好

    但是,我发现
    socksConfig
    并不总是包含有效数据,当我从那里提取IP时,它不工作或会使应用程序崩溃。因为我们从那里得到的唯一东西是本地主机IP,所以我在
    WebSocket.swift

    if enableSOCKSProxy {
        let proxyDict = CFNetworkCopySystemProxySettings()
        let socksConfig = CFDictionaryCreateMutableCopy(nil, 0, proxyDict!.takeRetainedValue())
        let propertyKey = CFStreamPropertyKey(rawValue: kCFStreamPropertySOCKSProxy)
        CFWriteStreamSetProperty(outputStream, propertyKey, socksConfig)
        CFReadStreamSetProperty(inputStream, propertyKey, socksConfig)
    }
    
    为此:

    let propertyKey = CFStreamPropertyKey(rawValue: kCFStreamPropertySOCKSProxy)
    let proxySocksConfig = ["SOCKSProxy": "127.0.0.1", "SOCKSPort": 8889, "SOCKSEnable": true] as CFDictionary // Where 8889 is the SOCKS proxy port in Charles
    CFWriteStreamSetProperty(outputStream, propertyKey, proxySocksConfig)
    CFReadStreamSetProperty(inputStream, propertyKey, proxySocksConfig)
    
    然后在Charles中启用socks代理,如您所述


    再次感谢

    找到了解决方案: 在尝试之后,我得出结论,尽管iOS模拟器遵循HTTP的系统代理设置,但没有遵循WebSocket。也不遵循Socks5代理设置。 但是,我们可以在Charles中使用
    反向代理
    ,强制模拟器使用它。
    在Charles中,单击
    Proxy->Reverse Proxy
    ,设置一个本地地址作为WebSocket服务器的透明代理,然后在
    新WebSocket()中使用该地址(在React Native的情况下很好),然后您可以在Charles中看到您的WebSocket连接

    您解决了问题吗?我有Charles 3.11.2,但仍然看不到websocket流量。我在Charles中看不到来自ios的websocket,但是,当从JavaScription启动时,我可以看到它们。你找到这个问题的答案了吗?@AndrewPaulSimmons是的,它可以与设备以及模拟器一起工作。在“代理设置>启用Socks代理”中。在SOCKS上启用HTTP代理可能也会有所帮助。我们正在使用红蜘蛛,WS数据没有被获取!我几乎要把Wireshark作为一个替代方案,问题是关于iOS模拟器的web套接字。通过JS发送时,Charles看到web套接字没有问题。更新WebSocket.swift后,它对我仍然不起作用。你能把最后一节的内容扩展一下吗?我在Charles和port比赛中启用了SOCKS代理,但我想知道我是否错过了什么。没关系。我让它工作了。我没有注意到enableSOCKSProxy必须为true。如果替换整个部分,包括
    如果enableSOCKSProxy{…}
    ,则不需要设置
    enableSOCKSProxy=true
    ,默认情况下所有连接都将启用它。。。。