소켓 프로그래밍 함수
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 |