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 수신함수
'Socket Programming' 카테고리의 다른 글
WSAAsyncSelect Model (0) | 2019.09.19 |
---|---|
[Socket] SELECT MODEL 네트워크 (0) | 2019.09.18 |
File IO, fopen_s, fseek, fread, fclose + 윈도우 소켓 라이브러리 (0) | 2019.07.23 |
비동기 Notificaion IO 모델, WSAAsyncSelect, WSAEventSelect, WSAWaitForMultipleEvents, WSAEnumNetworkEvents (0) | 2019.07.23 |
[Window Socket] 다이얼로그기반 서버 클라이언트 (0) | 2019.07.23 |