2013-04-10 4 views
3

나는 기본적인 중매 서버를 개발 중입니다. 기본 프로세스는 다음과 같이 진행됩니다다른 스레드에서 보내기 및 받기

  1. 클라이언트가 클라이언트의 이름과 그들이 다시
  2. Server 리포트 그/그녀와 일치
  3. 클라이언트가 선택 가능한 모든 일치를 찾고 있습니다 일치 유형을보고, 서버에 연결
  4. 서버와 짝을하고 싶은 것은 두 클라이언트에게 일치

문제 클라이언트가 연결될 때마다, 나는 모든 가능한 일치에 새로운 클라이언트를보고, 모든보고 필요가있다 새로운 연결 클라이언트와 일치 할 가능성이 있습니다 (따라서 일치하지 않는 클라이언트는 항상 서버에서 recv으로 준비되어야합니다). 동시에 클라이언트는 언제든지 일치 항목을 선택하거나 연결을 끊을 수 있습니다 (따라서 클라이언트는 항상 send으로 준비되어야하며 서버는 recv으로 준비되어야합니다)

이 문제의 실제 해결책은 다음과 같습니다. 스레딩을 사용하려면 클라이언트와 서버에 대한 백그라운드 스레드 recv과 메인 사용자 상호 작용 send 스레드.

그래서 나는 두 가지 질문이에 관한 한 :
  1. 는 서로 다른 스레드에서 동시에 동일한 소켓 연결 sendrecv에 저장되어 있습니까?
  2. 이것을 처리하는 것이 올바른 방법입니까?

합니다 (단절이 C에 내장되어 있기 때문에 C와 같은 ++ 및 OBJ-C를 태그 ++ 및 클라이언트는 OBJ-C)

+0

프로젝트가 Objective-C에만 국한되지는 않았지만 확장 가능한 asych을 구축하는 Grand Central Dispatch를 제공한다는 점을 알고 있습니다. I/O는 상대적으로 고통스럽지 않습니다. 작은 학습 곡선이 있지만 청취/recv/전송에 잘 작동하며 필요한 경우 각 소켓에 대해 새 대기열을 만들 수 있습니다. – dans3itz

답변

2

예, 동일한 스레드를 사용하는 다른 스레드의 send()recv()이고 다른 스레드는 send()입니다.

전용 스레드를 사용하는 서버 측은 동시에 서버에 동시에 연결된 클라이언트가 비교적 적은 경우에만 효과적으로 작동합니다. 확장 성이 중요한 경우 비동기 I/O 또는 가능하면 I/O 완료 포트를 사용하여 단일 스레드에서 여러 클라이언트를 관리해야하므로 필요한 스레드 수가 최소한으로 유지됩니다.

+0

"비교적 적음"을 정의 하시겠습니까? 10 대 정도의 고객, 10 대 정도의 고객, 100 대 정도의 고객을 의미합니까? 이 서버의 확장성에 대한 우려는 있지만 많은 수의 클라이언트가 동시에이 서버에 동시에 연결될 것으로 예상하지 않습니다. –

+0

100 개 이상의 클라이언트가 있으면 대체 스레딩 모델을 사용해야합니다. –

+0

나는 동의하지 않는다. 전적으로 귀하의 기계 용량에 대한 질문입니다. 스레드를 통해 수만 가지가 아니라면 수천을 일상적으로 처리하는 TCP 서버가 있습니다. – EJP

1

그것은 합리적인 소켓 라이브러리 구현에 안전합니다. 또한 올바른 방법입니다.