소켓 통신에 IOCP를 사용하는 클라이언트 응용 프로그램이 있습니다. Connectex를 사용하여 원격 연결 (링크를 호출하기 전에 소켓을 ADDR_ANY 및 포트 0에 바인딩)에 대한 TCP 연결을 만듭니다.ConnectEx가 동일한 IP 주소와 포트에 연결된 두 개의 소켓이 중복 된 IOCP 이벤트를 생성합니다.
동일한 원격 종단점 (동일한 IP 주소 및 포트 번호)에 두 개의 연결을 갖는 것이 유효합니다. 현재 코드로 그 조건을 테스트 할 때 WSARecv()에 대한 호출에서 두 개의 겹쳐진 IO 읽기 작업 (각 연결된 소켓에 하나씩)이 있습니다. 각 WSARecv()는 올바른 소켓 및 겹쳐진 구조로 호출됩니다. 예를 들면 다음과 같습니다. WSARecv (socket1, ... overlapped1) 및 WSARecv (socket2, ... overlapped2). 내가 겪었던 문제는 어느 리모콘으로부터 응답을 받으면 두 개의 중첩 된 중복 작업에 대한 완료 이벤트를 트리거한다는 것입니다. 내 코드는 두 개의 리모컨이 동일한 IP 주소와 포트 번호를 가지고있을 때만이 결과를 산출합니다. 두 개의 고유 한 원격 주소가있을 때가 아닙니다. 예상되는 동작입니까? 그렇다면이를 수행 할 또 다른 방법이 있습니까?
코드가 맞다고 생각할 수 있습니다. 하지만 여전히 게시해야합니다. 연결하기 전에 바인드는 무의미합니다. – EJP
오른쪽! 나는 아침에 그것을 게시 할 것이다. 두 개의 중복 된 원격 주소 대 두 개의 고유 한 원격 주소를 사용할 때 다른 동작으로 인해 정확하다고 생각합니다. Microsoft는 ConnectEx()를 사용할 때 바인드가 필요하다고 명시합니다. 바인딩없이 연결하려하지 않았습니다. – Ken
"* 어느 리모컨으로부터 응답을 받으면 두 개의 겹쳐진 연산에 대한 완료 이벤트를 트리거합니다 *"- 각 읽기에 대해 'OVERLAPPED'인스턴스를 올바르게 구분하면 불가능합니다. IOCP 코드에 버그가 있습니다. 2 개의 소켓에 대해 동일한 원격 IP/포트를 사용하는 것은이 문제와 관련이 없습니다. 소켓 연결은 프로토콜 및 로컬 IP/포트 및 원격 IP/포트로 고유하게 식별됩니다. 동일한 컴퓨터에있는 여러 클라이언트는 서로 다른 로컬 IP/포트에 바인딩되어있는 한 동일한 원격 IP/포트에 안전하게 연결할 수 있습니다. –