2017-11-07 3 views
0

소켓 통신에 IOCP를 사용하는 클라이언트 응용 프로그램이 있습니다. Connectex를 사용하여 원격 연결 (링크를 호출하기 전에 소켓을 ADDR_ANY 및 포트 0에 바인딩)에 대한 TCP 연결을 만듭니다.ConnectEx가 동일한 IP 주소와 포트에 연결된 두 개의 소켓이 중복 된 IOCP 이벤트를 생성합니다.

동일한 원격 종단점 (동일한 IP 주소 및 포트 번호)에 두 개의 연결을 갖는 것이 유효합니다. 현재 코드로 그 조건을 테스트 할 때 WSARecv()에 대한 호출에서 두 개의 겹쳐진 IO 읽기 작업 (각 연결된 소켓에 하나씩)이 있습니다. 각 WSARecv()는 올바른 소켓 및 겹쳐진 구조로 호출됩니다. 예를 들면 다음과 같습니다. WSARecv (socket1, ... overlapped1) 및 WSARecv (socket2, ... overlapped2). 내가 겪었던 문제는 어느 리모콘으로부터 응답을 받으면 두 개의 중첩 된 중복 작업에 대한 완료 이벤트를 트리거한다는 것입니다. 내 코드는 두 개의 리모컨이 동일한 IP 주소와 포트 번호를 가지고있을 때만이 결과를 산출합니다. 두 개의 고유 한 원격 주소가있을 때가 아닙니다. 예상되는 동작입니까? 그렇다면이를 수행 할 또 다른 방법이 있습니까?

+0

코드가 맞다고 생각할 수 있습니다. 하지만 여전히 게시해야합니다. 연결하기 전에 바인드는 무의미합니다. – EJP

+0

오른쪽! 나는 아침에 그것을 게시 할 것이다. 두 개의 중복 된 원격 주소 대 두 개의 고유 한 원격 주소를 사용할 때 다른 동작으로 인해 정확하다고 생각합니다. Microsoft는 ConnectEx()를 사용할 때 바인드가 필요하다고 명시합니다. 바인딩없이 연결하려하지 않았습니다. – Ken

+3

"* 어느 리모컨으로부터 응답을 받으면 두 개의 겹쳐진 연산에 대한 완료 이벤트를 트리거합니다 *"- 각 읽기에 대해 'OVERLAPPED'인스턴스를 올바르게 구분하면 불가능합니다. IOCP 코드에 버그가 있습니다. 2 개의 소켓에 대해 동일한 원격 IP/포트를 사용하는 것은이 문제와 관련이 없습니다. 소켓 연결은 프로토콜 및 로컬 IP/포트 및 원격 IP/포트로 고유하게 식별됩니다. 동일한 컴퓨터에있는 여러 클라이언트는 서로 다른 로컬 IP/포트에 바인딩되어있는 한 동일한 원격 IP/포트에 안전하게 연결할 수 있습니다. –

답변

0

문제가 발생한 이유에 대한 설명 일지라도 답변을 게시하고 있습니다.

내 테스트에는 데이터를 제공하는 원격 장치에 연결하여 통신하는 것이 포함됩니다. 그것은 digi 터미널 서버의 다른쪽에 있음이 밝혀졌습니다. 따라서 연결 경로는 다음과 같습니다.

내 테스트 컴퓨터 (TCP를 통한) -> Digi 터미널 서버 (직렬) -> 원격 장치.

digi 터미널 서버는 기본적으로 TCP/IP를 직렬 통신으로 변환하고 다시 전송합니다. 직렬 측에 'connectedness'개념이 없기 때문에 digi는 TCP/IP 요청이 TCP/IP 요청에 대한 응답으로 직렬 데이터를 수신해야하는지 알지 못하므로 직렬 데이터를 다음과 같은 모든 활성 연결로 전달합니다. TCP/IP 쪽. 그게 내 보류 중첩 된 작업 모두에서 IOCP 트리거를 생성합니다. 요청이 digi로 전송 될 때마다 요청을 직렬 포트에서 보냈습니다. 최종 장치가 응답하면 해당 숫자는 각 TCP/IP 연결에 응답 데이터를 전달했습니다.

제 질문에 댓글을 달았지만 시간을 내서 죄송합니다.

관련 문제