티스토리 뷰
반응형
* 본 포스팅은 한국소프트웨어진흥원 출처의 리눅스 네트워크 프로그래밍 PDF 파일을 토대로 작성되었습니다.
* 개인공부 후 자료를 남기기 위한 목적임으로 내용 상에 오류가 있을 수 있음을 밝힙니다.
소켓주소 구조체
※ 소켓주소는 클라이언트 또는 서버의 구체적인 주소를 표현하기 위해 필요.
※ 주소체계(address family), IP 주소, 포트번호로 구성
1 2 3 4 5 | struct sockaddr { u_short sa_family; char sa_data[14]; }; |
○ address family : u_short 자료형(2 byte, types.h에 정의)
○ sa_data : 14 byte의 IP주소 + 포트번호 정보가 담긴다.
※ IP 주소와 포트번호를 구분하여 쓰기나 읽기가 불편함으로
인터넷 전용 sockaddr_in 구조체를 사용한다.
인터넷 전용 소켓주소 구조체
1 2 3 4 5 6 7 8 9 10 11 | struct in_addr { u_long s_addr; }; struct sockaddr_in { short sin_family; u_short sin_port; struct in_addr sin_addr; char sin_zero[8]; }; |
○ sin_family (주소체계) : 3가지 방식을 지정할 수 있다.
- AF_INET (인터넷 주소 체계) : socket() 으로 소켓 개설 시 PF_INET 방식으로 지정한 소켓에 대한 주소 체계
- AF_UNIX (유닉스 파일 주소 체계) : 값은 2로 셋팅 되어 있다.
- AF_NS (XEROX 주소 체계) : 값은 2로 셋팅 되어 있다.
(특별한 경우가 아니면 AF_INET 만 사용된다고 생각해도 될 것 같다)
○ sin_port : 16 bit (2 byte)의 포트번호
○ struct in_addr 구조체 : 32 bit (4 byte)의 IP 주소가 저장되는 구조체
(그런데 왜 굳이 in_addr 구조체를 한번 거쳐서 IP를 저장하는지는 모르겠다. 그냥 u_long 자료형을 쓰면 안되나)
○ sin_zero[8]
- 전체 구조체의 크기를 16 byte로 맞추기 위한 dummy 변수다.
(sockaddr 구조체와의 호환성을 위해 16 byte로 맞출 필요가 있는 듯)
소켓 사용 절차
○ socket()
- 서버는 socket() 함수를 호출하여 통신에 사용할 소켓을 개설
- 클라이언트는 서버와의 연결을 위해 socket() 함수 호출
○ bind()
- 서버는 리턴된 소켓번호(디스크립터)와 소켓주소를 bind()를 통해 연결
- 소켓번호는 프로그램 내에서만 동작, 소켓주소는 네트워크 시스템 내에서의 주소,
두 개를 묶어야 프로세스와 네트워크 시스템간의 데이터 전달이 가능함
- 클라이언트는 bind()를 호출하지 않지만 특정 포트번호를 사용할 땐 호출한다.
○ listen()
- 서버는 listen() 함수를 호출하여 클라이언트로 부터의 연결 요청을 기다린다.
○ connect()
- 클라이언트는 socket()을 사용해 소켓을 만든 후 서버와의 연결 설정을 위해 connect()를 호출
- 접속할 서버의 소켓주소 구조체를 생성하여 connect()의 인자로 준다.
○ accept()
- listen상태의 서버가 클라이언트의 connect 요청을 받으면 accept()를 호출하여 연결설정을 한다.
- 연결이 성공하면 accept()가 새로운 소켓을 리턴, 리턴된 소켓번호를 통해 데이터를 송수신한다.
○ send(), recv()
- 연결이 수립되면 서버와 클라이언트간의 데이터 전송이 일어난다.
○ close()
- 볼 일을 마친 클라이언트가 서버와의 연결을 끝낸다.
반응형
'개인공부 > 소켓 프로그래밍' 카테고리의 다른 글
리눅스 소켓 프로그래밍 08 : TCP 서버 작성절차, 함수 (0) | 2014.02.11 |
---|---|
리눅스 소켓 프로그래밍 07 : TCP 클라이언트 프로그램 예제 (0) | 2014.02.08 |
리눅스 소켓 프로그래밍 06 : TCP 클라이언트 작성절차, 함수 (0) | 2014.02.07 |
리눅스 소켓 프로그래밍 05 : IP, 도메인 주소변환 (3) | 2014.02.03 |
리눅스 소켓 프로그래밍 03 : 디스크립터 확인 예제 (2) | 2014.02.02 |
리눅스 소켓 프로그래밍 02 : 소켓 socket() 함수 (3) | 2014.02.02 |
리눅스 소켓 프로그래밍 01 : 소켓(Socket) 정의 (0) | 2014.02.02 |