2009-06-30 3 views
1

오래 지속되는 연결을 갖는 UDP 서버 아키텍처의 경우 하나의 아키텍처는 들어오는 모든 UDP 트래픽을 수신 대기하는 소켓 connect()를 사용하여 원격지 주소를 설정하는 각 연결마다 별도의 소켓을 작성하십시오. 내 질문은 accept()가 TCP에 대해하는 것과 원자 적으로 비슷한 일을 할 수 있는지 여부이다.UDP (지연된 UDP 소켓 설정시 타이밍 문제)에 대한 accept() 에뮬레이트

별도의 소켓을 만들고 connect()를 사용하는 이유는이 기능을 사용하면 패킷 처리를 여러 스레드에 분산시키고 소켓을 필요한 데이터 구조와 직접적으로 쉽게 연결할 수 있기 때문입니다 처리를 위해. 네트워킹 스택의 디 멀티플렉싱 논리는 들어오는 패킷을 가장 특정한 소켓으로 라우팅합니다.

지금 내 질문은 하나가 동의를 모방하고자 할 때이 같은 UDP()에 발생하는 기본적으로 :

  1. 사용은 UDP 서버 소켓을 포함하는 FD-세트()을 선택합니다.

  2. 그런 다음 UDP 서버 소켓에서 패킷을 읽습니다.

  3. 그때 그때

  4. 내가 모두 소켓을 포함하는 FD-세트()를 선택 원격 호출 어드레스() ED를 연결하는 새로운 UDP 소켓을 생성한다.

  5. 무엇이 반환됩니까?

는 패킷은 패킷이 UDP 서버 소켓에 역 다중화 할 것인가 1 ~ 3

어딘가에 OS에 도착, 또는이 3에서 만든 더 구체적인 소켓에 역 다중화 될 것이라고 주어진 즉, 어떤 시점에서 디 멀티 플렉스가 발생합니까? 패킷이 도착할 때, 또는 그것이 마치 "마치"4 번 지점에 도착해야합니까?

위의 경우 작동하지 않는 경우 추가 질문 : 이것을 수행하는 가장 좋은 방법은 무엇입니까?

+0

다른 쪽 끝과 연결된 새 UDP 소켓을 만들 수도 있지만 동일한 서버 쪽 포트를 유지 하시겠습니까? 일반적으로 서버 측의 다른 포트에 UDP 소켓을 만들고, "서버 소켓"은 초기 요청에만 사용되며, 2 개의 다른 포트에서 추가로 통신이 이루어집니다. 또는 단지 서버에 1 개의 소켓을 사용하고 연결하는 데 신경 쓰지 마십시오. 동료 주소를 기록하면됩니다. UPD는 어쨌든 연결이되지 않습니다. – nos

답변

0

이것은 작동하지 않습니다.
두 가지 간단한 옵션이 있습니다.

  1. 하는 UDP 소켓과 소스에 따라 올바른 스레드에 '파견'수신 된 패킷에 듣고 '루트'스레드가있는 다중 스레드 프로그램을 작성합니다. 이는 소스별로 처리를 분리하려고하기 때문입니다.

    • 소스가 고정 포트에서 수신 연결을 허용하도록 프로토콜을 확장 한 다음 프로토콜 통신을 계속합니다. 이 경우 원하는 표준 UDP 포트에서 소스 요청을 보내면 새 UDP 소켓에서 소스의 UDP 포트로 응답합니다. 이렇게하면 끝에서부터 각 소스의 알려진 UDP 포트까지 새 UDP 경로가 시작됩니다. 그렇게하면 끝 부분에 다른 UDP 소켓이 생깁니다.
+0

왜이 기능이 작동하지 않습니까? 가장 구체적인 소켓으로 디 멀티 플렉스 할 OS의 예는 http://lxr.linux.no/linux-bk+v2.6.5/net/ipv4/udp.c#L222 을 참조하십시오. 제안 된 솔루션의 문제점은 솔루션 1이 확장되지 않을 수 있으며 솔루션 2에서 생성 된 패킷이 특정 NAT 뒤에있는 클라이언트에 도달하지 않을 수 있다는 것입니다. –

+0

자, 소켓 레이어 아래에서 코드를 작성할 의향이 없다는 것을 알았습니다. – nik

0

나는이 토론은 2009 년부터라고 볼 수 있지만, 그것이 내가 검색 할 때 팝업 유지하기 때문에, 나는 나의 접근 방식을 공유해야한다고 생각. 둘 다 약간의 피드백을 얻고 문제의 저자가 어떻게 문제를 해결했는지에 대한 골자이기 때문에.

내가 선택한 방법은 UDP-accept는 nik의 대답에서 1과 2의 조합이었습니다. 주어진 소켓에서 수신 대기하는 루트 스레드가 있습니다. 간단히하기 위해 TCP를 사용하기로했지만이 소켓을 UDP로 변경하는 것은 그리 어렵지 않습니다. 클라이언트가 UDP를 사용하여 내 서버에 "연결"하려고하면 먼저 TCP 소켓에 연결하고 새 연결을 요청합니다.

루트 스레드는 UDP 소켓을 생성하여 로컬 인터페이스에 바인드하고 데이터 구조를 연결하고 설정합니다. 이 파일 디스크립터는 연결을 담당 할 스레드로 전달된다. 새로운 UDP 소켓의 IP/포트 정보는 클라이언트에게 다시 전달되며, 클라이언트는 새로운 UDP 소켓을 생성하고 제공된 IP/포트로 데이터를 보냅니다.

이 접근법은 제 사용에는 적합하지만, 흐름을 설정하기위한 추가 단계는 오버 헤드를 유발합니다. 경우에 따라이 오버 헤드가 허용되지 않을 수도 있습니다.