IOCP 노트

우선 완성 포트는 내부 핵 대상이다.그리고 가장 복잡한 내부 핵 대상일 수도 있다.그것을 네트워크 통신 조작을 수용하는 대기열로 이해할 수 있다.
1. 입출력 완료 포트의 커널 개체 만들기
HANDLE WINAPI CreateIoCompletionPort(
  _In_      HANDLE FileHandle,
  _In_opt_  HANDLE ExistingCompletionPort,
  _In_      ULONG_PTR CompletionKey,
  _In_      DWORD NumberOfConcurrentThreads
);    

FileHandle은 열려 있는 파일 핸들 또는 INVALIDHANDLE_VALUE.
핸들일 경우 중첩 IO를 지원해야 합니다. 지정된 매개변수가 INVALID 인 경우HANDLE_VALUE 는 파일 핸들과 연결되지 않은 입출력 완료 포트를 생성합니다. 이 경우 두 번째 파라미터는 NULL이어야 하고 세 번째 파라미터는 무시됩니다.
ExistingCompletionPort는 이미 존재하는 입출력 완료 포트 또는 NULL입니다.
만약 이 파라미터가 이미 존재하는 IO 완성 포트라면, 이 함수는 이 완성 포트를 첫 번째 파라미터가 지정한 파일 핸들과 연결합니다.그리고 이 함수가 성공법을 실행하면 이미 존재하는 IO 완성 포트를 되돌려주고 새로운 완성 포트를 만들지 않습니다.이 인자가 비어 있으면, 이 함수는 새 완성 포트를 만듭니다.첫 번째 파라미터가 유효하면 새로 만든 IO 완성 포트를 첫 번째 파라미터가 지정한 파일 핸들과 연결합니다.그렇지 않으면 연관이 발생하지 않는다.
CompletionKey 완료 키
NumberOfConcurrentThreads
운영 체제는 입출력 완료 포트 병렬 처리 패키지의 최대 스레드 수에 맡길 수 있습니다.두 번째 매개변수가 NULL이 아니면 무시됩니다.만약 이 파라미터가 0이라면 시스템은 시스템의 프로세서 수와 똑같이 많은 병렬 실행 라인을 지원할 것이다.
먼저 TCP 서버 프로그램이 받아들일 때 실행해야 할 동작은 다음과 같다. 1.라이브러리 로드 2.TCP socket 생성 3.bind 4.listen 5.accept 6.데이터 교환.다른 TCP 클라이언트 프로그램에서 수행해야 할 작업은 다음과 같습니다.라이브러리 로드 2.TCP socket 생성 3.bind 4.데이터 교환
그러면 프로그램이 달리기 시작하는데 필요한 모든 작업에 필요한 함수에서 포트 완성을 지원할 수 있습니다. (차단된 작업이 있어야 포트 완성을 적용할 필요가 있습니다.)
1.WSASocket(...);//완성 포트를 지원하는 socket을 만들고 위의CreateIoCompletionPort () 를 호출하면 입출력 완성 포트를 지원하는 socket을 입출력 완성 포트의 핵 대상과 연결할 수 있습니다.
2.bind와listen은 막히지 않기 때문에bind와listen을 통해 실현
3. accept는 서버에서 클라이언트의 연결을 기다리고 accept를 직접 호출하면 이 과정은 막히고 이 동작을 실현하는 AcceptEx(...)완성 포트를 지원합니다. 그 중 감청 socket은 입출력 완성 포트 핵 대상과 연결되어 있어야 합니다.
               1. accept, WSAaccept는 동기화 작업이고 AcceptEx는 비동기 작업입니다 2.WSAaccept 함수 이전 accept 함수에 조건 함수를 추가하여 클라이언트 연결을 받아들일지 여부를 판단합니다. 3.AcceptEx는 비동기적이며 여러 AcceptEx 요청을 동시에 보낼 수 있으며 입출력 중첩 작업을 지원합니다.
4.accept 이후에 이번 연결에 대한 데이터 교환에 사용할 새로운 socket이 생길 것입니다.recv send
5. 완성 포트를 지원하는 WSARecv(...)및 WSASend(...);
int WSARecv(
  _In_     SOCKET s,
  _Inout_  LPWSABUF lpBuffers,
  _In_     DWORD dwBufferCount,
  _Out_    LPDWORD lpNumberOfBytesRecvd,
  _Inout_  LPDWORD lpFlags,
  _In_     LPWSAOVERLAPPED lpOverlapped,
  _In_     LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
);

매개 변수 lpFlag는 WSARecv(WSARecvFrom 포함) 행위를 수정하는 데 사용되는 바늘 매개 변수로 함수에서 호출된 socket이 원래 지정한 옵션을 초과할 수 있다. 다시 말하면 함수가 구체적으로 실현되는 기능은 socket이 만들 때의 설정과lpFlag 로고가 공동으로 결정한다.
lpFlags 매개 변수는 입력과 출력에 사용되며 응용 프로그램이 MSG 를 감지할 수 있도록 합니다PARTIAL 태그 비트의 출력 상태입니다.그러나 모든 프로토콜이 MSG를 지원하는 것은 아닙니다.PARTIAL 로컬 플래그 비트
함수가 즉시 완성되면 함수는 0을 되돌려주고 전송된 바늘의 지향 값을 업데이트합니다.함수에서 성공적으로 시작되었지만 작업이 나중에 완료되면 함수는 SOCKET 로 반환됩니다.ERROR 및 오류 코드는 WSAIO_PENDING

좋은 웹페이지 즐겨찾기