Проверка частной сети на наличие локальных устройств с определенным открытым портом (iPhone / Objective C) - PullRequest
0 голосов
/ 21 июля 2011

Я провел целый день, создавая систему между моим Mac и iPhone, где я использовал cocoaasyncsocket , чтобы создать сервер прослушивания на моем Mac и клиент на моем iPhone. Основная идея состоит в том, чтобы оставить приложение на Mac работающим, когда компьютер включен, а затем, когда я хочу передать данные из приложения iPhone, запустить приложение, когда оно подключается и отправляет данные ... У меня эта система работает точно как я хочу, чтобы он функционировал, но у меня есть 1 проблема, которую я пытался решить в течение примерно 4 часов!

Я хотел создать что-то, что сканирует мою беспроводную сеть для моего mac с запущенным слушателем ... Я думал, что это будет просто, но я ошибался. Я искал высоко и низко, но мне не повезло, и в качестве последнего средства я использую stackoverflow.

Мой текущий план состоял в том, чтобы «автоматически сканировать» путем получения внутреннего IP-адреса iPhone (т.е. 192.168.1.94), а затем использовать его, чтобы выяснить, какими будут другие IP-адреса в сети (192.168.1.0-254), теперь я знаю, какие IP-адреса нужно сканировать, я могу просмотреть каждый из них и проверить, открыт ли порт / я получил ответ.

Теперь я хочу сделать это как можно быстрее, однако я не смог получить НИЧЕГО, чтобы дать мне точные результаты ...

Использование connectToAddress:error: в cocoaasyncsocket просто вернет true для каждого из 255 различных IP-адресов, как и любые другие функции достижимости, с которыми я столкнулся ... Я читал, что это потому, что они проверяют только посмотрите, установлено ли соединение, и не волнует, что происходит на другом конце, поэтому мне нужно подумать о чем-то еще.

Мое единственное другое решение, о котором я могу подумать, - это, возможно, пропинговать каждый внутренний IP-адрес и посмотреть, получаю ли я ответ, но я не уверен, что это займет слишком много времени, чтобы пройти через 255 IP-адресов. и затем, как только я получу, какие IP-адреса активны, мне все равно придется проверить, открыт ли порт каким-либо образом: /

Если кто-нибудь здесь знает, как это можно сделать, или знает, как лучше проверить наличие открытого порта (я не очень хорошо разбираюсь в сетях), я был бы ОЧЕНЬ благодарен.

Спасибо за чтение,

Ли

Ответы [ 2 ]

4 голосов
/ 21 июля 2011

Хорошо, у меня сегодня была зарплата, и мне удалось заставить ее работать, используя 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 Browser , чтобы проверить, что мой сервис работает нормально (и он был) ...

Затем на клиенте нам нужно искать сервисиспользуя [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];}

Надеюсь, это поможет любому, кто застрял с этим ... Обратите внимание, что я заимствовал части других образцов / инструкций в один полный пост, который объясняет всю систему.

Наслаждайтесь.

3 голосов
/ 21 июля 2011

Я сам с этим не работал, но в основном Добрый день на самом деле то, что вы ищете, его цель - публикация и обнаружение сервисов

...