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 |
댓글