Archive for the 'NSNetServiceBrowser' Category

2015/12/24 LAN内のAFPホスト名をリストアップ v2

Cocoaの機能を用いて、LAN内のAFPベースのファイル共有を行っているホスト名の一覧を取得するAppleScriptです。

最初のバージョンでは、

 AppleScriptを実行したマシン自身のホスト名も返ってくる
 同じホスト名が複数回返ってくるケースがある

といった問題が見られました。また、

 I塒廚淵ぅ戰鵐肇魯鵐疋蕕含まれていた

というテスト段階のScriptならではの盲腸もあったため(近年、盲腸の人体内における役割が科学的に解明されつつありますが、あくまで慣用句的な意味において)、これらを改修して動作に支障がないことを確認しました。

AFP(AppleTalk over TCP/IPによるファイル共有)がオンになっている(≒ファイル共有がオンになっている)LAN上のホスト名を返します。検証範囲はOS Xマシンだけで、iOSデバイスについてはテスト対象としていません。

AFP以外のネットワークサービスを検出するテストを行っていますが、現状の待ち時間&Wait Loopの回数だと「LAN内にサービスが存在しない」場合にはかなり待たされるため、適宜変更したほうがよいかもしれません(ループ回数にとくに根拠はないので)。

AppleScript名:ASOCでafpホスト名をリストアップする v2
– Created 2015-12-24 by Takaaki Naganoya
– 2015 Piyomaru Software
use AppleScript version “2.4″
use scripting additions
use framework “Foundation”

property foundHosts : {}
property myHostName : “”

findHostsViaBonjour(“_afpovertcp._tcp”) of me –AFP’s port:548
–> {”MBA13″, “Mini_2″, “MBA11″}

on findHostsViaBonjour(aType)
  
  
set foundHosts to {}
  
set myHostName to (current application’s NSHost’s currentHost()’s localizedName()) as string
  
  
set aBrowser to current application’s NSNetServiceBrowser’s alloc()’s init()
  
aBrowser’s setDelegate:me
  
  
aBrowser’s searchForServicesOfType:aType inDomain:“”
  
  
repeat 1000 times
    if foundHosts is not equal to {} then exit repeat
    
delay 0.01
  end repeat
  
  
aBrowser’s setDelegate:(missing value)
  
  
return foundHosts
  
end findHostsViaBonjour

on netServiceBrowser:aNetServiceBrowser didFindService:aNetService moreComing:aMoreComing
  set aDesc to aNetServiceBrowser’s |description|()
  
set bDesc to aNetService’s |description|()
  
set cDesc to (aNetService’s |name|()) as text
  
  
if cDesc is not in foundHosts and cDesc is not equal to myHostName then
    set the end of foundHosts to cDesc
  end if
end netServiceBrowser:didFindService:moreComing:

★Click Here to Open This Script 

2015/12/23 LAN内のAFPホスト名をリストアップ

Cocoaの機能を用いて、LAN内のAFPベースのファイル共有を行っているホスト名の一覧を取得するAppleScriptです。

toplevel.png

Finder上の「ネットワーク」を選択すると、ファイル共有でアクセス可能なマシンの一覧が表示されます。

afp_hosts.png

これと同様に、(GUI表示は行いませんが)AFPをオンにしている(ファイル共有をオンにしている)ホスト名の一覧リストを取得します。AppleScriptを実行しているマシン自体でもファイル共有をオンにしていると、一緒にリストアップされます(自分自身は除外しておいたほうがいいかも)。

ただ、まだぜんぜんテスト段階のScriptなので問題が出るかもしれません(同じホスト名が複数回出現したりするので、そのあたり除外すべき)。

AFPホスト名の一覧を取得するのにさほど時間はかかっていません。キャッシュした結果を使っているか、ルーター(AirMac/AirPort Base Station)側で保持している値を返しているだけにも見えます(スリープ中のマシンの名称も見えています)。

取得した名称のホストにAFPで接続できる状態かどうかは、実際に別途確認しておいたほうがよいように見えます。

AppleScript名:ASOCでホスト名をリストアップする
– Created 2015-12-23 by Takaaki Naganoya
– 2015 Piyomaru Software
use AppleScript version “2.4″
use scripting additions
use framework “Foundation”

property foundHosts : {}

findHostsViaBonjour(“_afpovertcp._tcp”) of me –AFP’s port:548
–>  {”MBA11″, “MBA13″, “Mini_2″, “MBPR”, “MBA11_2″}

on findHostsViaBonjour(aType)
  
  
set foundHosts to {}
  
  
set aBrowser to current application’s NSNetServiceBrowser’s alloc()’s init()
  
aBrowser’s setDelegate:me
  
  
aBrowser’s searchForServicesOfType:aType inDomain:“”
  
  
repeat 1000 times
    if foundHosts is not equal to {} then exit repeat
    
delay 0.01
  end repeat
  
  
aBrowser’s setDelegate:(missing value)
  
  
return foundHosts
  
end findHostsViaBonjour

on netServiceBrowser:aNetServiceBrowser didFindService:aNetService moreComing:aMoreComing
  set aDesc to aNetServiceBrowser’s |description|()
  
set bDesc to aNetService’s |description|()
  
set cDesc to aNetService’s |name|()
  
set the end of foundHosts to (cDesc as text)
end netServiceBrowser:didFindService:moreComing:

on netServiceDidResolveAddress:aSender
  log aSender’s |description|()
  
log “netServiceDidResolveAddress”
end netServiceDidResolveAddress:

★Click Here to Open This Script