0

나는 2010 년 겨울부터 iTunes U에서 스탠포드 CS193p 과정 (iOS 프로그래밍) 강의 17 번에서 bonjour/NSStream 샘플 코드를 연구했습니다. 예제 코드는 다음과 같습니다. 이용 가능 here.CFSocket으로 순진한 서버 구현을 수정하여 다중 연결을 허용하는 방법

너트 셸에서 샘플 코드는 소켓을 만들고 포트 0에 바인드하여 사용 가능한 포트를 제공합니다. 그런 다음 NSNetService (bonjour)을 사용하여 해당 포트로 서비스를 게시합니다. NSNetServiceBrowser도 앱이 시작될 때 시작됩니다. 사용 가능한 서비스는 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]; 
} 
+1

이 질문에 대답하기 전에 : Mac (또는 Linux, Windows 또는 다른 데스크탑/서버 시스템)에 일반 BSD 소켓이있는 다중 클라이언트 서버를 작성하는 방법을 알고 있습니까? 그렇지 않다면, 먼저 그 것을 배우거나, 그 물건을 다루는 상위 레벨의 프레임 워크로 전환해서 배워야 할 필요가 없습니다. (CFSocket은 소켓 상단에 많은 것을 추가하는 일종의 중간 수준의 프레임 워크이지만 서버 로직을 연결하고 서버를 가지고있을만큼 충분하지는 않습니다.) – abarnert

+0

안녕하세요. 귀하의 회신에 감사드립니다. 나는 평범한 BSD 소켓으로 다중 클라이언트 서버를 작성하는 방법을 모르지만 나는 확실히 배우고 싶다. 좋은 리소스 나 샘플 코드를 제안 해 주시겠습니까? 나는 [Beej 's Guide to Network Programming] (http://beej.us/guide/bgnet/output/print/bgnet_USLetter.pdf)을 조금 보았다. 그걸 이해하면 저를 데려 갈 수 있습니까? 추신. 기본 네트워킹 수업에서 배울 수있는 무언가입니까? – RyanM

+0

Addison Wesley : Unix Network Programming : D를 읽기 시작했습니다. – RyanM

답변

1

는 그 과정 또는 샘플 코드를 특별히 익숙하지 해요,하지만. 따라서 게시 된 코드에서 -startReceive: 메서드와이 메서드를 호출하는 모든 것을 다른 클래스로 옮깁니다.

그런 다음 연결이 승인 될 때마다 해당 다른 클래스의 인스턴스를 만듭니다. 이 인스턴스는 해당 연결에서 모든 통신을 처리합니다. 초기화 중 연결에 대한 정보 (주로 fd)가 제공됩니다. 서버의 주 컨트롤러 객체는 어레이의 해당 인스턴스를 보유 할 수 있습니다.

여기서의 일은 서버가 실제로하는 일에 달려 있습니다. 적어도 연결 개체는 주 컨트롤러 개체를 닫을 때이를 알릴 필요가 있으므로 주 컨트롤러는 해당 개체를 배열에서 제거 할 수 있습니다. 이를 위해 알림 또는 대리자 패턴을 사용할 수 있습니다.

관련 문제