[통신] CH. 10 소켓 시스템콜(함수)

Kwaaaaan·2023년 3월 22일
2

통신

목록 보기
10/11
post-thumbnail

socket()

socket()함수는 socket(주소영역 지정, 서비스 타입, 프로토콜 지정)의 방식에 맞춰 사용됩니다. 소켓을 생성할 때 사용하는 함수이며, 성공적으로 실행되어 소켓이 만들어지면 해당 소켓의 디스크립터를 반환합니다.

bind()

socket()함수로 생성된 소켓에 주소를 부여합니다. bind(소켓, 바인드될 소켓의 주소, 주소크기)의 형식으로 함수를 사용합니다.

listen(), accept()

listen()과 accept()는 서버 프로세스에서 실행됩니다. listen()은 소켓을 활성화할때 사용하며, accept()함수는 accept(소켓, 주소, 주소의 길이)로 사용됩니다. accept()함수는 임의의 클라이언트의 연결 요구가 들어올때까지 대기하며, 연결 요청이 들어오면 둘 사이의 연결이 설정되고 서버에 새로운 소켓이 생성됩니다. 이후 데이터 송수신은 새로 생성된 소켓을 이용하여 이루어지게 됩니다.

send(), recv()

send()함수는 연결형 서비스를 제공하는 환경에서 데이터 전송하며, recv()함수는 연결형 서비스를 제공하는 환경에서 데이터를 수신합니다.

connect()

connect()함수는 클라이언트 프로세스에서 사용합니다. 또한, 매개변수로 설정된 주소값이 가리키는 서버와 연결을 설정합니다.

기타 함수 및 상수

• htons() htonl() --> 호스트와 네트워크의 주소체계를 맞춰주는 함수입니다. host to network, s는 short l은 long
• INADDR_ANY --> 로컬 호스트 상수(내 주소) 127.0.0.1
• inet_addr() --> 10진수에서 2진수로 변환하는 함수
• inet_ntoa() --> 2진수에서 10진수로 변환하는 함수

소켓의 흐름

소켓의 흐름은 TCP의 흐름과 UDP의 흐름 두가지로 나눌 수 있습니다.

TCP소켓의 흐름

서버(server) 흐름은 다음과 같습니다.
1. socket() 으로 소켓 생성
2. bind() 로 주소와 소켓 묶음
3. listen() 소켓 활성화
4. accept() 대기하다가 요청 들어오면 연결
5. send()/recv() 데이터 송수신 (반복)
6. close() 데이터 송수신이 끝나면종료

클라이언트(client) 흐름은 다음과 같습니다.
1. socket() 생성
2. connect() 서버 연결 기다림
3. recv() & send() 반복하며 통신
4. close()

아래의 그림과 같이 동작한다고 생각하면 됩니다.

UDP소켓의 흐름


위의 그림에서 보다시키, UDP소켓의 흐름은 비교적 간단합니다. listen과 accept가 생략된 형태이며, 클라이언트측에서는 새롭게 bind()함수가 실행되었습니다.
비연결형 서비스인 UDP에서는 비교적 간단한 흐름을 보이며, 전송 데이터마다 수신자의 소켓 주소를 함께 전달해 주어야 하므로 bind()함수가 실행되는것을 알 수 있습니다.

profile
스마트팩토리 개발자(를 꿈꾸며)

0개의 댓글