소켓 프로그래밍 함수

socket 함수

  • 소켓을 생성하는 함수이며, 위와 같은 매개변수를 가지고 초기화를 한다.
  • 소켓 생성을 실패하면 -1을 반환
socket(int domain, int type, int protocol);
socket(네트워크 주소 체계, 소켓 타입, 프로토콜);
  • 네트워크 주소 체계(int domain) : IPv4(AF_INET), IPv6(AF_INET6)
  • 소켓 타입(int type) : TCP(SOCK,STREAM), UDP(SOCK_DGRAM)
  • 프로토콜(int protocol) : TCP(IPPROPTO_TCP), UDP(IPPROTO_UDP), 대부분 0으로 설정하여 기본값 사용

ex)

SOCKET mySocket = socket(AF_INET, SOCK_STREAM, 0);
//socket(네트워크 주소 체계, 소켓 타입, 프로토콜);

bind 함수

  • 소켓에 로컬 주소와 포트를 할당한다.
  • 서버 측의 소켓에 IP와 포트를 할당하여 네트워크 인터페이스와 묶일 수 있도록 한다.
  • 실제로 소켓 주소 구조체를 이용할 때 IPv4 소켓 주소 구조체를 일반 소켓 구조체(SOCKADDR)로 변환하여 사용해야 한다.
bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
bind(소켓 변수, 서버 주소 구조체, 서버 주소 구조체의 크기);

 

  • 소켓 변수(int sockfd) : socket()으로 생성한 소켓의 파일 디스크립터
  • 서버 주소 구조체(const struct sockaddr *addr) : 할당할 주소 정보
  • 구조체의 크기(socklen_t addrlen) : 주소 구조체의 크기

ex)

struct sockaddr_in server_addr;
server_addr.sin_family = AF_INET; // IPv4
server_addr.sin_port = htons(8080);
server_addr.sin_addr.s_addr = INADDR_ANY;

bind(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr));
//bind(소켓 변수, 서버 주소 구조체, 서버 주소 구조체의 크기);
  • IPv4 소켓 주소 구조체(sockaddr_in)
    • 소켓 주소체계(sin_family)
    • 포트(sin_port)
    • IPv4 주소(sin_addr.s_ddr)

listen 함수

  • 소켓을 수신 대기 상태로 설정한다.
  • 클라이언트로부터 연결 요청을 기다린다.
listen(int sockfd, int backlog);
listen(소켓 변수, 백 로그 큐의 크기);
  • 소켓 변수(int sockfd) : socket()으로 생성한 소켓의 파일 디스크립터
  • 백 로그 큐의 크기(int backlog) : 대기열의 크기, 수신 대기 중인 클라이언트의 최대 수

ex)

listen(sockfd, 5);
//listen(소켓 변수, 백 로그 큐의 크기);

accept 함수

  • 수신 대기 중인 연결 요청을 수락한다.
  • accept() 함수 내부에서 클라이언트 주소를 설정한 뒤에 통신에 사용 할 클라이언트의 소켓을 반환한다.
  • 실제로 소켓 주소 구조체를 이용할 때는 IPv4 소켓 주소 구조체를 일반 소켓 구조체(sockaddr)로 반환하여 사용해야한다.
accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
accept(소켓 변수, 클라이언트 주소 구조체 변수, 클라이언트 주소 구조체 크기);
  • 소켓 변수(int sockfd) : socket()으로 생성한 소켓의 파일 디스크립터
  • 클라이언트 주소 구조체 변수(struct sockaddr *addr) : 클라이언트의 주소 정보가 저장될 구조체
  • 클라이언트 주소 구조체 크기(socklen_t *addrlen) : addr의 크기를 가리키는 포인터

ex)

struct sockaddr_in client_addr;
socklen_t client_len = sizeof(client_addr);
int new_sockfd = accept(sockfd, (struct sockaddr *)&client_addr, &client_len);
//accept(소켓 변수, 클라이언트 주소 구조체 변수, 클라이언트 주소 구조체 크기);

connect 함수

  • 클라이언트 측에서 서버에 연결을 요청한다.
connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
connect(소켓 변수, 서버 주소 구조체, 서버 주소 구조체 크기);
  • 소켓 변수(int sockfd) : socket()으로 생성한 소켓의 파일 디스크립터
  • 서버 주소 구조체(const struct sockaddr *addr) : 서버의 주소 정보
  • 서버 주소 구조체의 크기(socklen_t addrlen) : 주소 구조체의 크기

 

ex)

struct sockaddr_in server_addr;
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(8080);
inet_pton(AF_INET, "127.0.0.1", &server_addr.sin_addr);

connect(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr));
//connect(소켓 변수, 서버 주소 구조체, 서버 주소 구조체 크기);
  • IPv4 소켓 주소 구조체(sockaddr_in)
    • 소켓 주소체계(sin_family)
    • 포트(sin_port)
    • IPv4 주소(sin_addr)

send 함수

  • 소켓을 통해 데이터를 전송한다.
  • 특정한 소켓으로 문자열 버퍼에 담긴 내용을 전송한다.
  • 데이터 전송에 실패한 경우 -1을 반환한다.
send(int sockfd, const void *buf, size_t len, int flags);
send(소켓 변수, 문자열 버퍼, 문자열 버퍼 크기, 플래그);
  • 소켓 변수(int sockfd) : socket()으로 생성한 소켓의 파일 디스크립터
  • 문자열 버퍼(const void *buf) : 전송할 데이터의 버퍼
  • 문자열 버퍼 크기(size_t len) : 전송할 데이터의 길이
  • 플래그(int flags) : 전송 플래그(일반적으로 0)

ex)

const char *message = "Hello World!";
send(sockfd, message, strlen(message), 0);
//send(소켓 변수, 문자열 버퍼, 문자열 버퍼 크기, 플래그);

recv 함수

  • 소켓을 통해 데이터를 수신한다.
  • 데이터를 수신하여 특정 문자열 버퍼에 담는다.
  • 데이터 수신에 실패하는 경우 -1을 반환한다.
recv(int sockfd, void *buf, size_t len, int flags);
recv(소켓 변수, 문자열 버퍼, 문자열 버퍼 크기, 플래그);
  • 소켓 변수(int sockfd) : socket()으로 생성한 소켓의 파일 디스크립터
  • 문자열 버퍼(void *buf) : 수신된 데이터가 저장될 버퍼
  • 문자열 버퍼 크기(size_t len) : 수신할 최대 데이터 길이
  • 플래그(int flags) : 수신 플래그(일반적으로 0)

ex)

char buffer[1024];
ssize_t recv_len = recv(sockfd, buffer, sizeof(buffer), 0);
//recv(소켓 변수, 문자열 버퍼, 문자열 버퍼 크기, 플래그);

close 함수

  • 소켓을 닫는다.
close(int sockfd);
close(소켓 변수);
  • 소켓 변수(int sockfd) : socket()으로 생성한 소켓의 파일 디스크립터

ex)

close(sockfd)

 

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

C++ - TcpSocket 통신 Server 구현  (0) 2024.08.30
C++ - TCP 소켓 통신을 사용해보자  (0) 2024.08.14
C++ - Map  (0) 2024.08.01
C++ - STL 컨테이너  (0) 2024.07.31
C++ - Stack  (0) 2024.07.29