2014-12-12 3 views
-2

이 문제에 관해 많은 주제가 있지만, 제 상황에 대한보다 자세한 제안이 필요합니다.하나의 서버 다중 클라이언트 C/C++

내 아키텍처는 인터넷 연결없이 LAN의 이더넷으로 연결된 여러 개의 I/O 주변 장치 (CLIENT)와 중앙 장치 (SERVER)로 구성됩니다.

클라이언트는 내 서버에 데이터 (바이트)를 보내야하며 보낼 수있는 바이트 양은 각 주변 장치에 대해 약 20 바이트입니다. 또한 시스템은 몇 분, 1 시간 또는 며칠 동안 중단되지 않고 작동해야합니다. 문제가되지 않습니다. 매초마다 연결을 통해 데이터가 전송됩니다.

그래서 질문은 : TCP 또는 UDP를 사용해야합니까? 이 시나리오에서 어느 것이 더 낫습니까?

인터넷에서 일부 가이드를 읽었을 때 "select()"또는 "fork()"를 사용할 수 있습니다. 다중 사용자 채팅에 사용되는 다중 클라이언트 및 단일 서버 통신에 대한 몇 가지 기본 프로그램이 있습니다. 내 응용 프로그램과 다중 사용자 채팅의 차이점은 서버 컴퓨터의 파일에 데이터를 저장해야한다는 것입니다.

+0

C/C++과 같은 것이 없다. – 4rlekin

+0

'fork'와'select'는 시스템 호출과 관련이 없으므로 둘 중 하나를 사용할 수 있다고 말할 수는 없다. – b4hand

+0

나도 알아,하지만 나는 가이드에서 두 가지 방법으로 다문화 의사 소통을 사용하고있다. 그 이유에 대해 물었다. ;) –

답변

0

나는 유사한 응용 프로그램을 가지고 있으며, 알고있는 UDP를 사용합니다.이 서버는 수백 개의 주변 장치와 시간 시계에 사용되는 서버입니다. 내가 인정하는 의미는; 모든 클라이언트는 서버에 패킷을 보내고 확인 패킷 (ACK)을 기다립니다. 클라이언트가 ACK를받지 못하면 (2-4 초 내에) 동일한 데이터를 다시 보냅니다.

왜 UDP : TCP보다 프로그래밍하기가 쉽기 때문입니다. 서버 측에서는 포트에 바인딩 된 하나의 오픈 소켓 만 있으면 들어오는 패킷을 수신합니다. 일단 패킷이 수신되면 서버는 ACK 패킷을 송신 IP로 전송합니다. 클라이언트는 또한 ACK 패킷을 수신하기 위해 UDP 포트에 바인딩해야합니다. 이 포트 번호는 같거나 다를 수 있습니다. 서버 포트는 6050 일 수 있고 클라이언트 포트는 6060 일 수 있습니다 (예 : 귀하에게 달려 있음).

반면에 TCP를 사용하는 경우 연결된 클라이언트 당 소켓이 필요하며 어떤 데이터가 보류 중인지 확인하려면 select 또는 poll을 사용하십시오. 그러나이 경우 TCP는 신뢰성 있고 연결 지향적이므로 ACK가 필요하지 않습니다.

  1. The client’s packet is lost :

    두 당신이 UDP에 직면 수있는 문제가있다 이것은 가장 쉬운 하나, 클라이언트가 결코 ACK 패킷을 수신하지 않고 다시 동일한 패킷을 전송합니다.

  2. The server ACK packet is lost :이 경우 클라이언트는 동일한 패킷을 다시 보내고, 서버가 이미 가지고있는 패킷을 다시 보내면 패킷 중복이 문제가된다면 패킷에 번호를 매길 것을 고려할 수 있습니다. 클라이언트가 보내는 데이터에는 패킷 번호를 나타내는 필드 정수.이 정보로 서버는 중복을 제거 할 수 있습니다 : IP/패킷 번호.
+0

이 답변은이 문제에 대한 나의 모든 의구심을 해결합니다. 따라서 이러한 종류의 솔루션은 TCP보다 개발하기가 쉽지만 두 가지 사례가 있습니다. 답변 해주셔서 감사합니다! –

+0

정말로 TCP의 안정적인 전달을 다시 구현하면 TCP에 내장 된 버전만큼 신뢰할 수 있다고 생각합니까? 또한 별도의 연결을 유지할 필요가 없기 때문에 UDP가 더 간단하다는 점을 언급했지만 중복 패킷을 피하기 위해 UDP에서 별도의 연결을 유지하는 방법을 설명합니다. 왜 TCP 용으로 설계된 것이 아닌가? 기본적으로 코드에서 다시 구현하고 원래 작성자보다 더 나쁜 작업을 수행하기 시작했습니다. – b4hand

0

실제 질문은 다음과 같아야합니다. 메시지의 안정적인 전달이 필요합니까? 그렇다면 TCP를 사용해야합니다.

TCP의 오버 헤드는 종종 과장됩니다. Jeremy가 아래의 주석에서 언급했듯이, "정상적인"경우에 오버 헤드를 많이 피할 수 있습니다. 패킷 손실과 같은 나쁜 일이 발생하면 TCP와 UDP에서 오버 헤드를 지불해야하므로 무료로 안정적인 프로토콜의 작동 버전을 얻지 않으시겠습니까? 이것은 장기적으로 더 간단 할 것입니다. ja_mesa가 설명하는 연결 상태 추적은 TCP가 이미 사용자를 위해 수행 한 작업과 동일합니다. 시퀀스 번호라고합니다. 자신에게 은총을 베풀고 바퀴를 다시 구현하지 마십시오. 중요한 부분을 코딩하는 데 시간을 투자하십시오.

+0

예, 아니요, 모든 데이터가 중요합니다! 나는 아마도 질문의 요점을 피할 것이라고 생각하고있다. 속도면에서이 낮은 양의 데이터 (총 50 바이트 정도)로 UDP는 UDP보다 대기 시간이 더 길다. –

+1

TCP (Nagle의 알고리즘이 비활성화되도록 TCP_NODELAY 플래그가 설정 됨)는 패킷이 삭제 된 경우를 제외하고는 UDP와 거의 동일한 대기 시간을 제공합니다. (그 경우, 더 많은 데이터가 전송되기 전에 TCP 레이어가 돌아가서 삭제 된 패킷을 재전송해야하지만 UDP는 다음 패킷과 함께 계속 즐겁게 처리됩니다.) LAN 상에 있기 때문에 그런 일은 일어나지 않아야합니다 너무 자주,하지만 여전히 일어날 수 있습니다. 그 시나리오에서 드롭 된 패킷이 재전송되는 것이 더 중요한지 또는 다음 패킷이 평상시에 도착하는 것이 더 중요한지를 결정해야합니다. –

+0

OK 시나리오를 관리하는 방법이보다 명확 해졌습니다. 감사합니다;) –

관련 문제