2011-07-20 13 views
0

我花了整整一天在我的Mac和iPhone之間創建一個系統,我使用cocoaasyncsocket在我的Mac上創建一個偵聽服務器,客戶端在我的iPhone上。基本的想法是在計算機啓動時將應用程序保留在Mac上運行,然後當我希望從iPhone應用程序傳輸數據時,啓動它連接的應用程序併發送數據...我的系統正常工作我希望它的功能如何,但我有1個問題,我一直試圖解決總共約4小時!檢查專用網絡的本地設備打開的某個端口(iPhone/Objective C)

我想創建一些東西,用我的無線網絡掃描我的無線網絡,監聽器正在運行...我認爲這很簡單,但我錯了。我已經搜索了高和低,沒有運氣的情況下,我使用的是最後的手段stackoverflow。

我目前的計劃是通過檢索iPhone的內部IP(即192.168.1.94)來「自動掃描」,然後用它來確定網絡上的其他IP(192.168.1.0-254),現在我知道什麼IP的掃描我可以循環通過每一個,並檢查,看端口是否打開/我得到一個迴應。

現在,我想這樣做盡可能快,但是我一直沒能得到任何東西給我準確的結果...

在cocoaasyncsocket使用connectToAddress:error:將只是簡單地返回true爲每一個255個不同的IP地址,所以我會遇到任何其他可達性功能......我讀過這是因爲他們只檢查連接是否已經完成,不關心另一端發生了什麼,所以我需要考慮其他事情。

我能想到的唯一的其他解決方案是可能ping每個內部IP,看看我是否得到一個響應,但我不知道如果這將花費太多的時間必須通過255個IP地址。 ..然後,一旦我得到什麼IP的活動,我仍然必須檢查,看端口是否打開莫名其妙:/

如果任何人在這裏知道如何做可以或有任何更好的想法我可以檢查對於開放端口(我不擅長網絡)我會非常感激。

感謝您的閱讀,

利亞姆

回答

3

我還沒有與它的工作自己,但基本上Bonjour實際上是你在找什麼它的目的是發佈和發現服務

+0

您好,感謝您的回覆......我應該提到,我計劃在將來創建一個窗口監聽器,並且沒有關注bonjour,因爲我不確定我是否可以在windows上使用它。 ..我仍然會看看它,無論如何,謝謝 – liamnichols

+0

IIRC有一個bonjour版本的Windows,(我已經看到它在蘋果窗口更新),但我不知道他們是如何分配來源 –

+0

感謝您的信息..我認爲有Windows的.net SDK,所以我明天看看它。 – liamnichols

4

好吧,我今天有一筆支付,我設法使用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:

然後,您必須保留服務,給它一個代表,然後解決服務......然後,如果您聽取了關於netServiceDidResolveAddress:的NSNetServiceDeligate,則可以運行以下代碼將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];} 

希望這有助於任何堅持這一點的人..請注意,我借用了其他樣本/說明的部分內容,並將其作爲解釋整個系統的完整文章。

享受。