C++ #15 소켓 프로그래밍 함수

underlier12·2020년 2월 13일
0

C++

목록 보기
15/19
post-custom-banner

15. 소켓 프로그래밍 함수와 Winsock2

소켓 프로그래밍 함수

소켓 통신에 사용되는 함수들의 종류는 다음과 같다.

socket

socket(네트워크 주소 체계, 소켓 타입, 프로토콜)

소켓을 생성하는 함수며 위와 같은 매개변수를 가지고 초기화 한다. 소켓 생성을 실패하면 -1을 반환한다.

  • 네트워크 주소 체계 : IPv4(AF_INET), IPv6(AF_INET6)
  • 소켓 타입 : TCP(SOCK_STREAM), UDP(SOCK_DGRAM)
  • 프로토콜 : TCP(IPPROPTO_TCP), UDP(IPPROTO_UDP)

bind

bind(소켓 변수, 서버 주소 구조체, 서버 주소 구조체의 크기)

서버 측의 소켓에 IP와 포트를 할당하여 네트워크 인터페이스와 묶일 수 있도록 합니다.

  • IPv4 소켓 주소 구조체(SOCKADDR_IN) : 소켓 주소체계(sin_family), 포트(sin_port), IPv4 주소(sin_addr)

실제로 소켓 주소 구조체를 이용할 때 IPv4 소켓 주소 구조체를 일반 소켓 구조체(SOCKADDR)로 변환하여 사용해야 한다.

listen

listen(소켓 변수, 백 로그 큐의 크기)

클라이언트로부터 연결 요청을 기다린다. 백 로그란 동시에 연결을 시도하는 최대 클라이언트 수를 의미한다.

connect

connect(소켓 변수, 서버 주소 구조체, 서버 주소 구조체 크기)

클라이언트 측에서 서버에 연결을 요청한다. 소켓 생성에 실패하는 경우 -1을 반환한다.

  • IPv4 소켓 주소 구조체 : 소켓 주소체계(sin_family), 포트(sin_port), IPv4 주소(sin_addr)

실제로 소켓 주소 구조체를 이용할 때는 IPv4 소켓 주소 구조체를 일반 소켓 구조체(SOCKADDR)로 변환하여 사용해야 한다.

accept

accept(소켓 변수, 클라이언트 주소 구조체 변수, 클라이언트 주소 구조체 크기)

서버 측에서 클라이언트의 연결을 수락한다. accept() 함수 내부에서 클라이언트 주소를 설정한 뒤에 통신에 사용 할 클라이언트의 소켓을 반환한다. 오류가 발생하는 경우 -1을 반환한다.

실제로 소켓 주소 구조체를 이용할 때는 IPv4 소켓 주소 구조체를 일반 소켓 구조체(SOCKADDR)로 반환하여 사용해야 한다.

send

send(소켓 변수, 문자열 버퍼, 문자열 버퍼 크기, 플래그)

상대방에게 데이터를 보낸다. 특정한 소켓으로 문자열 버퍼에 담긴 내용을 전송한다. 플래그는 특별한 경우가 아니라면 0을 설정한다. 데이터 전송에 실패하는 경우 -1을 반환한다.

recv

recv(소켓 변수, 문자열 버퍼, 문자열 버퍼 크기, 플래그)

데이터를 수신하여 특정 문자열 버퍼에 담는다. 플래그는 특별한 경우가 아니라면 0을 설정하고 데이터 수신에 실패하는 경우 -1을 반환한다.

closesocket

closesocket(소켓 변수)

열린 소켓을 닫는다.

Winsock2

위의 함수들은 리눅스 기반에서 사용이 가능하며 윈도우 기반에서 사용하기 위해서는 Winsock2라는 라이브러리를 사용하여야 한다. Window Socket API의 준말로 네트워크 프로그래밍을 위한 라이브러리이다. 이를 사용하기 위해서는 ws2_32.dll 파일을 사용 설정해야 하며 WSAStartup() 함수 등을 통해 환경 설정을 진행해야 한다.

Winsock2는 윈도우를 위한 소켓 프로그래밍 라이브러리이므로 리눅스 프로그램에서는 사용 할 필요가 없다.

Winsock2를 포함한 통신 구조

WSAStartup

WSAStartup(윈속 버전, WSA 데이터 변수)

사용할 Winsock의 버전을 설정한다. 관련 설정 정보를 받기 위해 WSADATA 변수를 함께 넣어 준다.

WSACleanup()

WSACleanup()

Winsock2를 더 이상 사용하지 않음을 설정한다.

profile
logos and alogos
post-custom-banner

0개의 댓글