WSAIoctl
소켓의 모드를 제어하는 함수
int WSAAPI WSAIoctl(
IN SOCKET s,
IN DWORD dwIoControlCode,
IN LPVOID lpvInBuffer,
IN DWORD cbInBuffer,
OUT LPVOID lpvOutBuffer,
IN DWORD cbOutBuffer,
OUT LPDWORD lpcbBytesReturned,
IN LPWSAOVERLAPPED lpOverlapped,
IN LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
);
s : 소켓
dwIoControlCode : 함수가 수행하는 연산의 제어코드
lpvInBuffer : 입력 버퍼에 대한 포인터
cbInBuffer : 입력버퍼의 크기(lpvInBuffer의 크기)
lpvOutBuffer : 출력 버퍼에 대한 포인터
cbOutBuffer : 출력버퍼의 크기(lpvOutBuffer의 크기)
lpcbBytesReturned : 출력시 실제로 받는 바이트 수치
lpOverlapped : WSAOVERLAPPED 구조체의 포인터
lpCompletionRoutine : 입력 완료시 호출된 완료 루틴의 포인터
DisconnectEx와 AcceptEx를 사용할 수 있도록 준비
AcceptEx
새 연결을 만들어 accept 하고, 로컬과 리모트의 주소, 클라이언트에게 받은 첫번째 데이터 블록을 리턴
BOOL AcceptEx(
SOCKET sListenSocket,
SOCKET sAcceptSocket,
PVOID lpOutputBuffer,
DWORD dwReceiveDataLength,
DWORD dwLocalAddressLength,
DWORD dwRemoteAddressLength,
LPDWORD lpdwBytesReceived,
LPOVERLAPPED lpOverlapped
);
sListenSocket : Listen 상태에 있는 소켓, 해당 소켓에 오는 연결 시도를 기다린다
sAcceptSocket : 들어오는 연결을 받는 소켓, 연결되거나 bound 되지 않아야 함
lpOutputBuffer : 새로 들어온 연결에서 받은 첫번째 데이터 블록의 버퍼. 서버의 로컬주소, 클라이언트의 리모트 주소
dwReceiveDataLength : lpOutputBuffer로 받은 실제 데이터의 길이
dwLocalAddressLength : 로컬 주소 정보의 바이트 수
dwRemoteAddressLength : 리모트 주소 정보의 바이트 수
lpdwBytesReceived : DWORD 의 포인터, 받은 바이트의 갯수
lpOverlapped : OVERLAPPED 구조체
에러 없다면 TRUE, 에러 발생시 FALSE를 리턴하고 WSAGetLastError 함수를 호출해 에러 정보를 볼 수 있다.
AcceptEx 함수가 성공하면
1. 새로운 커넥션이 accept 되고
2. 커넥션의 로컬, 리모트 주소가 반환되며
3. remote에서 보낸 첫번째 데이터 블록을 받는다.
'C++ > C++ 정리' 카테고리의 다른 글
Hacker rank day17 (0) | 2021.09.27 |
---|---|
Socket 4 (0) | 2021.03.02 |
Socket 2 (0) | 2021.02.15 |
Socket 1 (0) | 2021.02.09 |
C++ STL 정리 (0) | 2020.06.29 |
댓글