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

Socket 1

by COCO1337 2021. 2. 9.

WSAStartup

Winsock DLL을 사용하기 위해 초기화

int WSAAPI WSAStartup(
  WORD wVersionRequested,
  LPWSADATA lpWSAData
);

mVersionRequested : Windows Sockets의 버전을 지정할때 사용

lpWSAData : WSADATA 구조체의 포인터로, Windows Sockets의 구현 정보를 받아온다

MAKEWORD(lowbyte, highbyte) : Windef.h의 매크로중 하나

WSAStartup의 결과가 0이 아니면 Winsock DLL을 사용할 수 없는 등 에러가 발생한 것

 

WSADATA구조체는 Windows Socket의 구현정보를 담을때 사용


WSASocketW

소켓을 만들고 특정 transport-service 제공자와 연결

SOCKET WSAAPI WSASocketW(
  int                 af,
  int                 type,
  int                 protocol,
  LPWSAPROTOCOL_INFOW lpProtocolInfo,
  GROUP               g,
  DWORD               dwFlags
);

af : 주소지정체계, 주로 AF_INET 사용(IPv4)

type : SOCK_STREAM (TCP), SOCK_DGRAM (UDP)

protocol : 소켓에 추가로 사용할 프로토콜, IPPROTO_ICMP, IPPROTO_IGMP 등이 있고, 여기서는 0 사용

lpProtocolInfo : WSAPROTOCOL_INFO 구조체의 포인터

g : 소켓에 그룹 지정할 때 사용, 0

dwFlag : 소켓의 추가 속성을 위한 flag, WSA_FLAG_OVERLAPPED 사용하면 overlapped I/O를 지원하는 소켓을 생성

 

WSAPROTOCOL_INFO 구조체는 프로토콜 정보들을 저장하거나 검색할때 사용


setsockopt

소켓의 옵션을 설정

int WSAAPI setsockopt(
  SOCKET     s,
  int        level,
  int        optname,
  const char *optval,
  int        optlen
);

s : 소켓의 파일디스크립터

level : 프로토콜 레벨, SOL_SOCKET

optname : 변경할 옵션의 이름

optval : 변경할 옵션을 위한 버퍼 주소값 전달

optlen : optval로 전달된 버퍼의 크기

 

SO_REUSEADDR 옵션을 설정하면 커널이 소켓을 사용하는중에도 계속 사용할 수 있음, 서버 프로그램이 종료된 후에도 커널이 소켓의 포트를 아직 점유중인 경우에 서버 프로그램을 재구동할때 유용


bind

소켓에 local address를 연결

int WSAAPI bind(
  SOCKET         s,
  const sockaddr *name,
  int            namelen
);

s : 아직 연결되지 않은 소켓

name : sockaddr구조체의 포인터

namelen : sockaddr 구조체의 크기

성공시 0 반환, 아닌경우에는 SOCKET_ERROR를 반환하며, WSAGetLastError를 호출해서 에러를 확인할 수 있다.

 

sockaddr 구조체는 기본적인 소켓의 주소를 담을 때 사용


listen

소켓을 연결 대기 상태로

int WSAAPI listen(
  SOCKET s,
  int    backlog
);

s : bound, unconnected 소켓

backlog : 연결을 위한 최대 큐 길이. SOMAXCONN으로 설정하면 가능한 최대 크기로 잡음

에러가 없다면 0을, 아니면 SOCKET_ERROR를 반환하며, WSAGetLastError를 호출해서 에러 확인할 수 있다.


accept

들어오는 소켓의 연결을 허가

SOCKET WSAAPI accept(
  SOCKET   s,
  sockaddr *addr,
  int      *addrlen
);

s : listen 함수로 listen상태가 된 소켓

addr : 연결 요청한 소켓의 주소 정보

addrlen : addr 의 길이

 

에러가 없다면 새로운 SOCKET을 만들어 번환하고, 에러 발생시 INVALID_SOCKET 반환, WSAGetLastError 호출해서 에러를 확인할 수 있다.


 

반응형

'C++ > C++ 정리' 카테고리의 다른 글

Hacker rank day17  (0) 2021.09.27
Socket 4  (0) 2021.03.02
Socket 3  (0) 2021.02.25
Socket 2  (0) 2021.02.15
C++ STL 정리  (0) 2020.06.29

댓글