21-1. Overlapped 입출력의 의미
비중첩 데이터 입출력 모델
중첩된 데이터 입출력 모델
하나의 쓰레드 내에서 여러 개의 입출력이 진행되는 것
21-2. Overlapped 입출력을 위한 기본 단계
1. Overlapped 소켓의 생성
SOCKET WSASocket(
__in int af,
__in int type,
__in int protocol,
__in LPWSAPROTOCOL_INFO lpProtocolInfo,
__in GROUP g,
__in DWORD dwFlags
);
af : address family
type : 소켓 형태
protocol : 사용된 프로토콜(여기까지 socket과 동일)
lpProtocolInfo : 생성될 소켓의 성경을 정의하는 wSAPROTOCOL_INFO 포인터
g : 예약됨.
dwFlags : 소켓 속성을 지정하는 플래그
WSASocket(PF_INET, SOCK_STREAM, 0, NULL, 0, WSA_FLAG_OVERLAPPED);
WSA_FLAG_OVERLAPPED는 Overlapped 입출력이 가능하도록 하는 플래그.
2. 데이터 송수신
※ 다음 함수들은 버퍼에 존재하는 데이터를 모아서 한 번에 전송하고(Gather) 수신된 데이터를 여러 버퍼에 나누어 저장(Scatter)하는 Gather/Scatter 입출력을 한다.
int WSASend(
SOCKET s, // 소켓 핸들
LPWSABUF lpBuffers, // WSABUF 구조체 배열의 포인터
DWORD dwBufferCount, // lpBuffers가 가리키는 배열의 크기
LPDWORD lpNumberOfBytesSent, // 전송된 바이트 수를 저장하기 위한 포인터
DWORD dwFlags,
LPWSAOVERLAPPED lpOverlapped,
LPWSAOVERLAPPED_COMPLETION_ROUTING lpCompletionRoutine
);
리턴 : 성공시 0, 실패시 SOCKET_ERROR
typedef struct __WSABUF{
u_long len;
char FAR *buf;
}WSABUF, FAR* LPWSABUF;
int WSARecv(
SOCKET s, // 소켓 핸들
LPWSABUF lpBuffers, // 수신 버퍼 정보를 지니는WSABUF 구조체 배열의 포인터
DWORD dwBufferCount, // lpBuffers가 가리키는 배열의 크기
LPDWORD lpNumberOfBytesRecvd, // 전송된 바이트 수를 저장하기 위한 포인터
DWORD dwFlags,
LPWSAOVERLAPPED lpOverlapped,
LPWSAOVERLAPPED_COMPLETION_ROUTING lpCompletionRoutine
);
리턴 : 성공시 0, 실패시 SOCKET_ERROR
lpOverlapped : 중첩된 입출력을 하기 위해 사용.
3. 데이터 송수신 완료 확인
이벤트 커널 오브젝트 기반
CALLBACK 함수 기반
'네트워크 프로그래밍' 카테고리의 다른 글
[TCP/IP 소켓 프로그래밍] 22. Completion Port 입출력 모델 (0) | 2009.09.11 |
---|---|
[TCP/IP 소켓 프로그래밍] 20. 동기와 비동기의 이해 (2) | 2009.08.28 |
[TCP/IP 소켓 프로그래밍] 19. 윈도우즈 기반 쓰레드 동기화 (0) | 2009.08.24 |
[TCP/IP 소켓 프로그래밍] 18. 윈도우즈 기반 쓰레드 사용하기 (0) | 2009.08.20 |
[TCP/IP 소켓 프로그래밍] 17. 프로세스(Process)와 쓰레드(Thread) (0) | 2009.08.19 |