2

私は一日中、MacとiPhoneの間にシステムを作成し、 cocoaasyncsocketを使用してMacにリッスンサーバーを作成し、iPhoneにクライアントを作成しました。基本的な考え方は、コンピューターの電源が入っている間、アプリをMacで実行したままにし、iPhoneアプリからデータを転送したいときに、アプリを起動して接続し、データを送信することです...このシステムは正確に機能していますどのように機能させたいのか、合計で約4時間解決しようとしている問題が1つあります。

リスナーが実行されている状態で、ワイヤレスネットワークをスキャンしてMacをスキャンするものを作成したかったのですが、これは簡単だと思いましたが、間違っていました。私はケースで運がなくて高低を検索しました、そして私は私の最後の手段としてstackoverflowを使用しています。

私の現在の計画は、iPhoneの内部IP(つまり、192.168.1.94)を取得して「自動スキャン」し、それを使用してネットワーク上の他のIP(192.168.1.0-254)を把握することでした。これで、どのIPかがわかりました。スキャンするには、それぞれをループして、ポートが開いているかどうかを確認します/応答を受け取ります。

今、私はこれをできるだけ早くやりたいのですが、正確な結果を出すために何も得ることができませんでした...

cocoaasyncsocketで使用connectToAddress:error:すると、255個の異なるIPアドレスのすべてに対してtrueが返されるだけなので、私が遭遇した他の到達可能性関数も同様です...接続が確立されたかどうかを確認するだけだからです。反対側で何が起こるかは気にしないので、別のことを考える必要があります。

私が考えることができる他の唯一の解決策は、おそらく各内部IPにpingを実行して応答が得られるかどうかを確認することですが、255個のIPアドレスを通過するのに時間がかかりすぎるかどうかはわかりません...そして、アクティブなIPを取得したら、ポートが何らかの理由で開いているかどうかを確認する必要があります:/

ここの誰かがそれがどのように行われるかを知っているか、私が開いているポートをチェックする方法についてもっと良い考えを持っているなら(私はネットワーキングがあまり得意ではありません)、私は非常に感謝します。

読んでくれてありがとう、

リアム

4

2 に答える 2

5

わかりました。今日は支払いがあり、Bonjourを使用してなんとか機能させることができました。

それをすべて理解するのに時間がかかったので、私は他の誰かを助けると思いました...

まず、リスナー側でNSNetServiceを設定する必要があります。これは、次のように行うことができます。

    listenService = [[NSNetService alloc] initWithDomain:@"" type:@"_appname._tcp" name:@"Display Name" port:2427];
    [listenService setDelegate:self]; //make sure you include the NSNetServiceDelegate
    [listenService publish];

次に、NSNetServiceDelegateにプラグインして、サービスが正常に公開されたことを確認し、 Bonjourブラウザーを使用して、サービスが正常に実行されていることを確認します(実際に実行されていました)...

次に、クライアントで[NSNetServiceBrowser][3]を使用してサービスを検索する必要があります...これは次のように実行できます。

    serviceBrowser = [[NSNetServiceBrowser alloc] init];
    [serviceBrowser setDelegate:self]; //remember to include NSNetServiceBrowserDelegate
    [serviceBrowser searchForServicesOfType:@"_appname._tcp" inDomain:@""];

次に、リッスンできるNSNetServiceBrowserDelegateメソッドを含めると

netServiceBrowser:didFindService:moreComing:

次に、サービスを保持し、デリゲートを与えてから、サービスを解決する必要があります...次に、NSNetServiceDeligateをリッスンする場合はnetServiceDidResolveAddress:、次のコードを実行して、sockaddrを読み取り可能なIPアドレスに変換できます。

#include <arpa/inet.h>

-(void)netServiceDidResolveAddress:(NSNetService *)sender {
for (NSData* data in [sender addresses]) {

    char addressBuffer[100];

    struct sockaddr_in* socketAddress = (struct sockaddr_in*) [data bytes];

    int sockFamily = socketAddress->sin_family;

    if (sockFamily == AF_INET ) {//|| sockFamily == AF_INET6) { /*only support ipv4 atm*/

        const char* addressStr = inet_ntop(sockFamily,
                                           &(socketAddress->sin_addr), addressBuffer,
                                           sizeof(addressBuffer));

        int port = ntohs(socketAddress->sin_port);

        if (addressStr && port) {
            //you now have the services IP and Port.. all done
        }
    }
}
[sender release];}

これがこれに固執している人に役立つことを願っています。他のサンプル/手順の一部を、システム全体を説明する1つの完全な投稿に借用したことに注意してください。

楽しみ。

于 2011-07-21T14:31:19.487 に答える
3

私自身はそれを使ったことがありませんが、基本的にBonjourは実際にあなたが探しているものであり、その目的はサービスの公開と発見です。

于 2011-07-20T22:10:58.200 に答える