728x90
소켓/소켓 API
소켓 API
- 정의
- System call API 중 하나이다.
- 운영체제가 응용프로그램에게 제공하는 통신용 인터페이스다.
- 역할
- 컴퓨터 하드웨어의 네트워크 통신장치를 응용프로그램이 간접적으로 이용할 수 있게 해준다.
소켓
- 정의
- 응용프로그램에 설치하는 데이터 송수신 출입구
- 사용하는 이유
- 응용프로그램은 응용프로그램의 일만 처리하도록 하기 위해서 사용한다. 응용프로그램이 데이터 송수신을 위한 각종의 일을 직접 수행할 필요가 없다.
- 통신의 업무는 운영체제의 네트워크 스택이 해준다.
- 네트워크 스택이 하는 일
- 데이터의 패킷화
- 주소 지정
- 라우팅
- 전송 오류 처리
- 네트워크 스택이 하는 일
- 컴퓨터가 데이터들을 송수신할 때, 꼬이지 않게 해준다.
- 컴퓨터 내에서 실행되는 다양한 프로세스가 엄청난 양의 데이터 송수신을 일으키는데, 운영체제에 의해 데이터 송수신이 관리되면 다양한 문제를 해결할 수 있다. 그래서 운영체제는 응용프로그램에게 통신시 사용할 수 있는 socket API를 제공하여 응용프로그램은 데이터를 보내고 받기만 할 수 있게 한다.
- 어떤 응용프로그램에서 송수신하는 데이터인지 운영체제 측에서 알아야 하는데 이 소켓이 프로세스별 end point로 역할하여 송시신지가 문제없이 관리된다.
소켓 API 사용법
- 소켓 생성
- 통신을 위한 소켓을 생성한다.
int sockfd = socket(domain, type, protocol);
- 인자
- domain
- 프로토콜 주소체계 지정
- IPv4 : ‘AF_INET’
- IPv6 : ‘AF_INET6’
- 로컬 : ‘AF_UNIX’ or ‘AF_LOCAL’
- socket type
- TCP 방식 : ‘SOCK_STREAM’
- UDP 방식 : ‘SOCK_DGRAM’
- protocol
- 프로토콜 지정 인자
- 기본 프로토콜 : 0
- TCP 방식 : ‘IPPROTO_TCP’
- UDP 방식 : ‘IPPROTO_UDP’
- domain
- 반환값
- 생성된 socket에 대한 File Descriptor로, 운영체제에 의해 생성되며, 이후 소켓을 사용할 때 인자 값으로 보내야 한다.
- 소켓 바인딩
- 소켓에 IP주소와 포트 번호를 할당하는 것이다.
- 서버 프로그램에서 주로 사용한다.
bind(sockfd, (struct sockaddr*)&my_addr, sizeoof(my_addr));
- 인자
- socket descriptor
- address
- socket이 바인딩 될 주소(구조체의 포인터)
- IP와 PORT 번호 설정
- address length
- 주소 구조체의 크기 지정
- 연결 수립
- 클라이언트
- connect() : 서버에 연결 요청
- 서버
- listen() : 클라이언트 요청 확인
- accept() : 클라이언트의 연결 요청 수락
//클라이언트 connect(sockfd, (struct sockaddr*)&server_addr,sizeof(server_addr)); //서버 listen(socked, backlog); int new_fd = accept(sockfd, (struct sockaddr*)&their_addr, &addr_size)
- 인자
- listen
- socket description
- 대기 큐의 길이(backlog)
- accecpt
- socket description
- address
- socket이 바인딩 될 주소
- IP, PORT 번호
- address length
- 주소 구조체의 크기 지정
- connect
- socket descriptor
- server address
- listen
- 클라이언트
- 데이터 송수신
- 데이터 송신
- 데이터 수신
send(sockfd, "Hello, world!", data_size, flags); recv(sockfd, buffer, sizeof(buffer), flags); // UDP sendto(sockfd, "Hello, world!", data_size, flags, dest_addr, addr_len); recvfrom(sockfd, buffer, sizeof(buffer), flags, dest_addr, addr_len);m);
- read와 write도 동일한 목적으로 사용 가능하다.
- LINUX에서만 사용 가능하다
- 네트워크 장치를 file로 인식하는 OS 특성상 사용 가능한 system call 함수이다.
- 네트워크 실행 특성을 반영하는 정보를 읽고 쓰기 위해 만들어진 것이 아니기 때문에 기능이 제한적이다.
- 이 때문에, UDP의 경우 반드시 send를 써야 동신이 가능하다.
- 인자
- socket descriptor
- data buffer
- 전송할 데이터를 담고 있는 버퍼이다. 또는 수신된 데이터를 저장할 버퍼의 포인터다.
- data size
- data byte 수
- flags
- 데이터 송수신 동작 제어를 위한 옵션 플래그
- 대상 주소
- UDP의 경우에만, 상대방의 주소정보를 담은 구조체의 포인터
- 주소 길이
- 상대방의 주소 구조체의 크기
- 소켓 닫기
- close 통신 완료 후, 소켓을 닫고 리소스를 해제한다.
close(sockfd);
- 인자
- socket file descriptor
728x90
'Computer > 서버 & 네트워크' 카테고리의 다른 글
HTTP(Hyper Text Transfer Protocol) (0) | 2024.02.25 |
---|---|
웹 서버 (0) | 2024.02.25 |
파일 식별자File Descriptor(FD) (0) | 2024.02.25 |
클라이언트 - 서버 모델 (0) | 2024.02.24 |
OSI 7계층 & TCP/IP 4계층 (0) | 2024.02.23 |