2012-01-27 4 views
1

다른 프로토콜 (UDT)을 지원하도록 iperf을 수정하려고합니다. 그럼 내가해야 할 일은 런타임에 연결할 라이브러리 선택

socket(...); 
    bind(...); 
    listen(...); 

는 조건부입니다 iperf에서 이러한 호출이 UDT 코드를 사용할 수 있도록 소켓 대신 UDT 라이브러리와 링크 다음 UDT의 API는 표준 BSD 호출을 반영하도록 작성 TCP 스택에 대한 인터페이스 이 작업을 수행 할 수 있습니까? 난 항상 라이브러리를로드하고 UDT :: namespace를 사용하는 다른 조건부 경로를 가질 수 있지만, 1) TCP 경로에서 중복되는 부분이 많으며 2) 변경 사항이 많을 수도 있습니다. 제가 명확하지 않다면이 동적 링크를 달성하는 방법에 대한 제안을 부탁드립니다.

편집 : 아래에 언급 된 dlopen을() 제품군을 사용

, 나는 다음과 같은 프로그램 흐름 수 :

는 cmd를 라인 PARAMS 구문 분석 -> UDT가 요청하는 경우를로드 라이브러리 libudt -> 얻을 모든 UDT BSD 함수 (바인드, 수신 대기 등)에 핸들을 저장하십시오.

이 시점에서 모든 UDT 함수에 저장된 함수 포인터가 있습니다. udt_calls라는 구조체에 이들 모두를 저장한다고 가정 해 봅시다.

  bind(...) 

보다는 : 자, 그냥 같은 통화를 만드는 기존 코드에 문제가 전 세계적으로이 프로그램을 통해 어떤 BSD 호출을 대체 할 수 있습니다 깨끗한 방법이 있나요

  udt_calls->bind(...) 

을 내 이제 내 udt_calls 구조체에 함수 포인터가로드 되었습니까?

+0

혹시이 작업이 완료나요 :

또 다른 옵션은 구조체에 대한 포인터를 선언 한 후 전처리 같이 정의하고 사용할 수있다? UDT를 수행하는 패치 또는 iperf 버전이 있습니까? –

답변

1

예 가능합니다. 동적 라이브러리로드를 사용해야합니다. Windows에서는 LoadLibrary을 사용합니다. Linux 또는 Unix에서는 dlopen 및 친구들을 사용하여 이루어집니다.

설명서를 읽고 해당 기능에 대한 샘플을보고 싶을 것입니다. 간단한 요약은 함수 포인터 (struct에서 자주 수행되며 Windows에서는 C++ 가상 함수 클래스에로드 할 수있는 트릭이 있음)를 만드는 것입니다. 그런 다음 동적로드 함수를 사용하여 라이브러리를 연 다음 함수 포인터를 지정하여 라이브러리 내부의 함수를 가리 킵니다.

그런 다음 함수 포인터 (또는 C++ 가상 함수)를 사용하여 함수를 호출합니다.

편집 : It looks like there are ways to use C++ virtual base classes in Unix as well.

편집 : 나는 대부분의 시스템은 운영 시스템 라이브러리는 "약한"기호를 사용하게 있다고 생각합니다. 즉, 동일한 이름의 고유 한 전역 심볼을 정의하고 OS 라이브러리 버전을 무시할 수 있습니다. 자신의 프로그램에서 전역 함수 포인터를 선언하여 bindlisten의 전역 버전을 제공하십시오.

#define bind udt_calls->bind 
+0

감사! 이것은 제가 찾고있는 것 같습니다. 그러나 위의 편집 내용을 보면 미리 작성된 코드에 문제가 있습니다. 해결책을 제안 할 수 있습니까? –

+0

@ agent0range : 자신의 프로그램에서 전역 함수 포인터를 선언하여 'bind'의 OS 라이브러리 버전을 무시하십시오. –

관련 문제