티스토리 뷰

Socket Programming

비동기 IO (Overlapped IO)

열혈허슬러 상추님 2019.09.18 15:28
190711 - Study
 

 
비동기 IO가 사실상 Overlapped(중첩된) IO나 다름없다.
 
IO 중첩 : 하나의 쓰레드에서 둘 이상 영역으로 데이터를 전송. 윈도우에서는 IO가 완료된 상황 확인방법에 포커스를 맞춘다. 넌-블로킹 모드로 IO를 하면 이후 완료결과를 별도로 확인하는 작업이 필요하다.
 
SOCKET WSAAPI WSASocketA(
  int                 af,    //프로토콜 체계 정보
  int                 type,    // 데이터 전송방식
  int                 protocol,    
  LPWSAPROTOCOL_INFOA lpProtocolInfo,
  GROUP               g, // 예약변수
  DWORD               dwFlags
);
● Overlapped IO 소켓 생성
WSASocketA(PF_INET, SOCK_STREAM, 0, NULL, 0, WSA_FLAG_OVERLAPPED);
 
int WSAAPI WSASend(
  SOCKET                             s,
  LPWSABUF                           lpBuffers,
  DWORD                              dwBufferCount, 
  LPDWORD                            lpNumberOfBytesSent,
  DWORD                              dwFlags,
  LPWSAOVERLAPPED                    lpOverlapped, // 이곳엔 항상 NULL이 아닌 유효한 값이 필요하다. / 둘 이상 영역으로 전송시 해당 구조체 별도로 구성해야함
  LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
);
● 데이터 입출력에 사용하는 함수. Overlapped IO 진행
 
typedef struct __WSABUF {
  u_long   len;
  char FAR *buf;
} WSABUF, *LPWSABUF;
● 위 함수에서 두 번째 인자로 전달되는 구조체
 
typedef struct _WSAOVERLAPPED {
  DWORD    Internal;
  DWORD    InternalHigh;
  DWORD    Offset;
  DWORD    OffsetHigh;
  WSAEVENT hEvent;
} WSAOVERLAPPED, *LPWSAOVERLAPPED;
 
BOOL WSAAPI WSAGetOverlappedResult(
  SOCKET          s,
  LPWSAOVERLAPPED lpOverlapped,
  LPDWORD         lpcbTransfer,
  BOOL            fWait,
  LPDWORD         lpdwFlags
);
● 데이터 전송결과 및 수신결과를 확인하는 함수
 
int WSAAPI WSARecv(
  SOCKET                             s,
  LPWSABUF                           lpBuffers,
  DWORD                              dwBufferCount,
  LPDWORD                            lpNumberOfBytesRecvd,
  LPDWORD                            lpFlags,
  LPWSAOVERLAPPED                    lpOverlapped,
  LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
);
● Overlapped IO 수신함수
 
댓글
댓글쓰기 폼