2010 年冬から iTunes U でスタンフォード大学 CS193p コース (iOS プログラミング) のレクチャー #17 の bonjour/NSStream サンプル コードを学習しています。サンプル コードはこちらから入手できます。
簡単に言うと、サンプル コードはソケットを作成し、ポート 0 にバインドして空きポートを割り当てます。NSNetService
次に、 (bonjour)を使用してそのポートでサービスを公開します。NSNetServiceBrowser
アプリ起動時にanも起動します。利用可能なサービスは に配置されますUITableView
。セルを選択すると、対応するサービスが解決され、NSOutputStream
が作成され、データを送信できます。
接続が既に存在する場合、接続は拒否されるため、これは単純な実装です。私の質問は、複数の接続を処理する適切な方法は何ですか? 複数のクライアントがサーバーに接続されると、サーバーはそれらをどのように区別しますか? つまり、特定のクライアントだけにデータを送信し、他のクライアントには送信しないようにするにはどうすればよいでしょうか。
- (void) _acceptConnection:(int)fd
{
int junk;
// If we already have a connection, reject this new one. This is one of the
// big simplifying assumptions in this code. A real server should handle
// multiple simultaneous connections.
if ( self.isReceiving ) {
junk = close(fd);
assert(junk == 0);
} else {
[self _startReceive:fd];
}
}
// Called by CFSocket when someone connects to our listening socket.
// This implementation just bounces the request up to Objective-C.
static void AcceptCallback(CFSocketRef s,
CFSocketCallBackType type,
CFDataRef address,
const void *data,
void *info)
{
ReceiveServer * obj;
assert(type == kCFSocketAcceptCallBack);
assert(data != NULL);
obj = (ReceiveServer *) info;
assert(obj != nil);
assert(s == obj->_listeningSocket);
[obj _acceptConnection:*(int *)data];
}