NSNetServiceからIPやホスト名、ポート番号を取得する方法について

967 views
Skip to first unread message

hiro

unread,
Mar 31, 2009, 4:46:44 AM3/31/09
to cocoa-dev-japan
皆様お助けください。

NetServiceBrowser、NetServiceを使ってアプリケーションを開発しています。

サービス公開では、次のようなコードでpublishしています。
NSString* publishDomain = @"local.";
NSString* type = @"_hoge._tcp.";
NSString* hostName = @"test";
netService = [[NSNetService alloc] initWithDomain:publishDomain
type:type name:hostName port:port];
[netService publish];

そして、クライアントでは、

- (void)netServiceBrowser:(NSNetServiceBrowser *)aNetServiceBrowser
didFindService:(NSNetService*)aNetService moreComing:(BOOL)moreComing
{

NSLog(@"hostname = %@", [aNetService hostName]);
NSLog(@"name = %@", [aNetService name]);
NSLog(@"port = %d", [aNetService port]);
NSArray* addresses = [aNetService addresses];

for(NSData* data in addresses) {
NSLog(@"address = %@", data);
}
}

このようにコーディングしているのですが、取得できるのはnameだけで、hostnameは(null), portは0, addressesはサ
イズが0で何も入ってきません。

さらに、APIリファレンスをみると、NetServiceにはdelegateを設定でき、その中に (void)
netServiceDidResolveAddress:(NSNetService *)sender といういかにも怪しそうなものがあったの
で、delegateを設定し、メソッドを追加してみましたがまったく呼び出されません。

ただし、NetServiceのgetInputStream:outputStreamでストリームクラスは取得でき、通信はできます。

どなたかこのような現象に会ったことはないでしょうか?

アドバイスよろしくお願いいたします。

}

kimura wataru

unread,
Mar 31, 2009, 10:07:57 AM3/31/09
to cocoa-d...@googlegroups.com
木村といいます。

NSNetServiceBrowserを利用して見つかったNSNetServiceからは
すぐにホスト名などを取得できません。

(1) -[NSNetService resolveWithTimeout:]を呼ぶ。
(2) デリゲートメソッドnetServiceDidResolveAddress:が呼ばれたら
  senderからhostnameなどを読み取る

という手順が必要になると思います。

使っているAPIがちょっと古い(-[NSNetService resolve]はdeprecated)ですが、
ADCのサンプルのPictureSharingBrowserが参考になると思います。

http://developer.apple.com/samplecode/PictureSharingBrowser/listing3.html

serviceClicked:でresolveを開始し、netServiceDidResolveAddress:で
結果を受け取っています。


ホスト名などがすぐに得られないようになっている理由は、
"NSNetServices and CFNetServices Programming Guide"の
"Resolving and Using Network Services"によると、
サービスの名前は不変の値であるのに対して、IPアドレスやポート名は
セッションごとに異なる値を取りうるから、
ということだそうです。

http://developer.apple.com/DOCUMENTATION/Networking/Conceptual/NSNetServiceProgGuide/Articles/ResolvingServices.html


On Tue, 31 Mar 2009 01:46:44 -0700 (PDT), hiro wrote:
>
> 皆様お助けください。
>
> NetServiceBrowser、NetServiceを使ってアプリケーションを開発しています。
>

> そして、クライアントでは、
>
> - (void)netServiceBrowser:(NSNetServiceBrowser *)aNetServiceBrowser
> didFindService:(NSNetService*)aNetService moreComing:(BOOL)moreComing
> {
>
> NSLog(@"hostname = %@", [aNetService hostName]);
> NSLog(@"name = %@", [aNetService name]);
> NSLog(@"port = %d", [aNetService port]);
> NSArray* addresses = [aNetService addresses];
>
> for(NSData* data in addresses) {
> NSLog(@"address = %@", data);
> }
> }
>
> このようにコーディングしているのですが、取得できるのはnameだけで、
> hostnameは(null), portは0, addressesはサ
> イズが0で何も入ってきません。
>


--
kimura wataru

hiro

unread,
Apr 2, 2009, 2:00:53 AM4/2/09
to cocoa-dev-japan
木村様

アドバイスありがとうございます.PictureSharingBrowserを参考にやってみたら,うまく行きました.

失敗の原因は,resolveWithTimeout:は呼び出していたのですが,netServiceDidResolveAddressで
結果を受け取る前に,streamをopenしてしまっていたからでした.

現在は,netServiceDidResolveAddressでアドレスやホスト名を解決した後,streamを開くように変更し,
うまく動作しています.

ありがとうございました!
picture

On 3月31日, 午後11:07, kimura wataru <kimu...@gmail.com> wrote:
> 木村といいます。
>
> NSNetServiceBrowserを利用して見つかったNSNetServiceからは
> すぐにホスト名などを取得できません。
>
> (1) -[NSNetService resolveWithTimeout:]を呼ぶ。
> (2) デリゲートメソッドnetServiceDidResolveAddress:が呼ばれたら
>   senderからhostnameなどを読み取る
>
> という手順が必要になると思います。
>
> 使っているAPIがちょっと古い(-[NSNetService resolve]はdeprecated)ですが、
> ADCのサンプルのPictureSharingBrowserが参考になると思います。
>
> http://developer.apple.com/samplecode/PictureSharingBrowser/listing3....
>
> serviceClicked:でresolveを開始し、netServiceDidResolveAddress:で
> 結果を受け取っています。
>
> ホスト名などがすぐに得られないようになっている理由は、
> "NSNetServices and CFNetServices Programming Guide"の
> "Resolving and Using Network Services"によると、
> サービスの名前は不変の値であるのに対して、IPアドレスやポート名は
> セッションごとに異なる値を取りうるから、
> ということだそうです。
>
> http://developer.apple.com/DOCUMENTATION/Networking/Conceptual/NSNetS...
>
>
>
>
>
> On Tue, 31 Mar 2009 01:46:44 -0700 (PDT), hiro wrote:
>
> > 皆様お助けください。
>
> > NetServiceBrowser、NetServiceを使ってアプリケーションを開発しています。
>
> > そして、クライアントでは、
>
> > - (void)netServiceBrowser:(NSNetServiceBrowser *)aNetServiceBrowser
> > didFindService:(NSNetService*)aNetService moreComing:(BOOL)moreComing
> > {
>
> > NSLog(@"hostname = %@", [aNetService hostName]);
> > NSLog(@"name = %@", [aNetService name]);
> > NSLog(@"port = %d", [aNetService port]);
> > NSArray* addresses = [aNetService addresses];
>
> > for(NSData* data in addresses) {
> > NSLog(@"address = %@", data);
> > }
> > }
>
> > このようにコーディングしているのですが、取得できるのはnameだけで、
> > hostnameは(null), portは0, addressesはサ
> > イズが0で何も入ってきません。
>
> --
> kimura wataru- 引用テキストを表示しない -
>
> - 引用テキストを表示 -
Reply all
Reply to author
Forward
0 new messages