WSARecv
연결된 소켓으로부터 데이터를 받을때 사용
int WSAAPI WSARecv(
SOCKET s,
LPWSABUF lpBuffers,
DWORD dwBufferCount,
LPDWORD lpNumberOfBytesRecvd,
LPDWORD lpFlags,
LPWSAOVERLAPPED lpOverlapped,
LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
);
s : 연결된 소켓
lpBuffers : WSABUF 구조체의 포인터, 각 WSABUF구조체는 buffer 포인터와 길이등을 가지고 있다
dwBufferCount : lpBuffers에 사용된 WSABUF의 개수
lpNumberOfBytesRecvd : receive 과정이 끝나고 받은 bytes, lpOverlapped가 NULL이 아닐때에만 이 옵션에 NULL을 설정할 수 있음
lpFlags : 함수의 호출 방식 지정
lpOverlapped : WSAOVERLAPPED 구조체의 포인터, overlapped 소켓이 아닌경우에는 무시됨
lpCompletionRoutine : receive 과정이 끝나고 호출할 루틴의 포인터, overlapped 소켓이 아닌경우에는 무시됨
정상적으로 실행된 경우 0 반환, 에러 발생시 SOCKET_ERROR 반환되며, WSAGetLastError() 함수로 가져올 수 있다.
WSASend
연결된 소켓에 데이터를 보낼때 사용
int WSAAPI WSASend(
SOCKET s,
LPWSABUF lpBuffers,
DWORD dwBufferCount,
LPDWORD lpNumberOfBytesSent,
DWORD dwFlags,
LPWSAOVERLAPPED lpOverlapped,
LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
);
s : 연결된 소켓
lpBuffers : WSABUF구조체를 담은 배열의 포인터
dwBufferCount : lpBuffers 배열의 크기
lpNumberOfBytesSent : 함수 호출로 전송된 데이터의 바이트 크기
lpOverlapped : 함수 호출 방식 지정, overlapped 소켓이 아닌 경우 무시
lpCompletionRoutine : 데이터 전송 완료시 호출할 루틴의 포인터, overlapped 소켓이 아닌 경우 무시
정상적으로 실행되면 0, 실패시 SOCKET_ERROR가 반환되며, WSAGetLastError() 함수로 가져올 수 있다. 에러코드가 WSA_IO_PENDING이면 overlapped 연산을 위한 초기화 작업이 성공적으로 진행되었으며, 데이터 전송이 아직 진행중
ioctlsocket
소켓의 io 모드를 컨트롤할때 사용
int WSAAPI ioctlsocket(
SOCKET s,
long cmd,
u_long *argp
);
s : 연결된 소켓
cmd : 소켓 s에 적용할 명령
argp : cmd에 적용할 값
성공시 0을 반환하고 실패시 SOCKET_ERROR 반환하며, 에러 코드는 WSAGetLastError 함수로 가져올 수 있다.
FIONBIO로 소켓의 blocking/non-blocking을 설정할 수 있다. 1은 non-blocking
nagle
네이글 알고리즘은 TCP/IP에서 데이터 전송 효율을 위해 패킷을 모아서 보낸다(패킷 갯수를 줄임).
작은 패킷으로 서버와 클라이언트의 동기화가 필요한 경우 네이글 옵션을 꺼줘야 한다.
'C++ > C++ 정리' 카테고리의 다른 글
Hacker rank day17 (0) | 2021.09.27 |
---|---|
Socket 4 (0) | 2021.03.02 |
Socket 3 (0) | 2021.02.25 |
Socket 1 (0) | 2021.02.09 |
C++ STL 정리 (0) | 2020.06.29 |
댓글