본문 바로가기
C++/C++ 정리

Socket 2

by COCO1337 2021. 2. 15.

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

댓글