2012-06-27 3 views
0

여러 IP/포트에 연결하는 응용 프로그램을 작성하려고하는데 문제가있는 것은 IP 주소가 알려지지 않아 하나의 부서에서 연결할 수 있다는 것입니다. 2 ips와 다른 부서는 8에 연결할 수 있습니다. 따라서 런타임 중에 구성 가능해야합니다. 루프 내부에서 스레드 나 포크를 사용하는 것이 좋겠지 만 어느 것이 더 나은지는 확실하지 않습니다. 나는 리눅스에서 C를 사용하고있다. 예를 들어여러 IP/포트에 대한 TCP 소켓

하나는 다음과 같이 실행할 수 있습니다 a.out의 IP1 포트 1 IP2 PORT2 IP3 PORT3 및 포트 1 IP1이의 a.out의 a.out 같은

감사

내가 볼

답변

3

를 실행할 수 있습니다 다른 4 가지 디자인을 선택할 수 있으며, 각각 장점과 단점이 있습니다. 귀하의 선택은 귀하의 응용 프로그램이 무엇을하는지에 달려 있습니다.

  1. 1 프로세스/소켓 (포크)이 하나 개의 프로세스 (예를 들어, 세그먼트 폴트)에서 치명적인 에러가 다른 프로세스에 영향을 미치지 않는다는 장점을 가지고있다. 단점은 접근 방식이 더 많은 자원을 필요로하고 프로세스를 조정하기가 더 어렵다는 점입니다 (예 : 동적로드 균형 조정을 원할 경우).

  2. 1 스레드/소켓 (pthreads) : 이것은 공유 메모리 공간을 공유하기 때문에 매우 가볍고 스레드가 쉽게 조정할 수 있다는 장점이 있습니다. 단점은 한 스레드의 오류로 인해 전체 응용 프로그램이 다운 될 수 있다는 점입니다.

  3. 유한 상태 기계 : 당신은 모든 소켓에 큰 poll을하는 단일 프로세스에서 단일 스레드를 사용할 수 있습니다, 다음 오른쪽 (비 차단) 액션, 즉, read, write 또는 close 걸립니다. 이것은 단일 프로세서에서 매우 빠르다고 들었지만 멀티 코어 아키텍처를 이용하지 않으며 프로그램하기가 다소 어려웠습니다.

  4. 하이브리드 : 위의 3 가지 중 하나를 선택하여 결합합니다. 예를 들어 Apache server을 참조하십시오.

+0

# 2는 프로그램을 멀티 스레드로 만듭니다. 경쟁 조건, 데이터 손상, 잠금 및 교착 상태의 흥미 진진한 세계로 여러분을 안내합니다. 이를 고려해야합니다. – ugoren

+0

fd가 스레드간에 공유되기 때문에 그렇습니까? –

+0

@BagDev no. 이러한 디자인에서 각 스레드는 자체 fd를 가지며 (클라이언트 연결시 accept() 스레드에 의해 전달됨) 독립적으로 작동합니다. 데드락 (deadlock) 등의 문제를 일으키려면 서버를 직접 입력해야합니다. 서버가 자체 클라이언트에서 요청/응답을하면 차단/읽기 루프가됩니다. 한 클라이언트 - 서버 스레드가 다른 fd (예 : 채팅)와 통신하기를 원하면 문제가 발생할 수 있습니다. 한 스레드의 총 오류 (예 : 와일드 포인터)가 실제로 전체 앱을 다운시킬 수는 있지만 실제로 그렇게하려면 나쁜 코드를 작성해야합니다. –