2

Macにsquidhttpプロキシを設定し、ワイヤレス接続を共有するようにMacを設定しました。電話のwifi接続情報で、HTTPプロキシ設定を設定しました。

Server: 10.0.2.1
Port:   3128
Authentication: off

私のiOSアプリケーションでは、ネットワークにアクセスする方法が2つあります。httpリクエストにはNSURLRequestを使用し、他のTCP接続にはAsyncSocketライブラリを使用しています。

NSURLRequestを使用するすべてのリクエストは、問題なくプロキシを使用します(SSLの場合、プロキシはHTTP CONNECTトンネルとして機能します)。ただし、AsyncSocket接続に使用するプロキシを取得できないようです。

CFStreamsが作成されるたびに、以下を呼び出すようにAsyncSocketライブラリを更新しました。例:

//for printing out the proxy settings
static void printEntry (const void* key, const void* value, void* context) {
    CFShow(key);
    CFShow(value);
}

- (BOOL)createStreamsFromNative:(CFSocketNativeHandle)native error:(NSError **)errPtr
{
    // Create the socket & streams.
    CFStreamCreatePairWithSocket(kCFAllocatorDefault, native, &theReadStream, &theWriteStream);
    .
    .
    .
    CFDictionaryRef proxyDict = CFNetworkCopySystemProxySettings();
    CFDictionaryApplyFunction(proxyDict, printEntry, NULL); // I see the proxy settings are correct here

    CFReadStreamSetProperty(theReadStream, kCFStreamPropertyHTTPProxy, proxyDict);
    CFWriteStreamSetProperty(theWriteStream, kCFStreamPropertyHTTPProxy, proxyDict);

    CFRelease(proxyDict);
    return YES;
}

私がここで見逃した明らかなことはありますか?

4

2 に答える 2

1

ストリームを作成CFHTTPReadまたは書き込みしていないため、ソケットストリームはを無視してい kCFStreamPropertyHTTPProxyます。

于 2012-08-10T04:42:05.327 に答える
0

アップルのドキュメントから:

https://developer.apple.com/library/ios/#DOCUMENTATION/Networking/Conceptual/CFNetwork/CFStreamTasks/CFStreamTasks.html#//apple_ref/doc/uid/TP30001132-CH6-DontLinkElementID_16

これが機能しないことを示すものは何もありません。ドキュメントには、CFHTTPStreamsではなくCFStreamsの使用について記載されています。

ドキュメントに記載されているとおりに機能させることができず、時間が不足していたため、独自のHTTPプロキシコードを実装しましたが、最終的には非常に困難でした。構成でHTTPプロキシが設定されていることが示されている場合は、最初の接続をプロキシにリダイレクトし、次のヘッダーを使用してHTTPリクエストを開始しました。

CONNECT <real host>:<real port> HTTP/1.1
Host: <real host>
Proxy-Connection: keep-alive
Connection: keep-alive

200応答コードの完全なhttp応答を受信すると、サーバーと直接通信するかのようにソケット通信を開始します(たとえば、startTLSを呼び出してSSLを開始するなど)。

于 2012-09-02T19:30:38.977 に答える