티스토리 뷰

반응형



* 본 포스팅은 한국소프트웨어진흥원 출처의 리눅스 네트워크 프로그래밍 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()
- 볼 일을 마친 클라이언트가 서버와의 연결을 끝낸다.



반응형
프로필사진

Yowu (Yu Yongwoo)

흔한 Node.js/Java 백엔드 개발자입니다
Ubuntu와 MacOS 데스크탑 개발 환경을 선호합니다
최근에는 vscode와 IntelliJ를 사용하고 있습니다
vscode에는 neovim, IntelliJ는 ideaVim
개발용 키보드는 역시 HHKB Pro 2 무각입니다
락 밴드에서 드럼을 쳤습니다

최근에 올라온 글
최근에 달린 댓글
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함
Total
Today
Yesterday