티스토리 뷰



* 본 포스팅은 한국소프트웨어진흥원 출처의 리눅스 네트워크 프로그래밍 PDF 파일을 토대로 작성되었습니다.

* 개인공부 후 자료를 남기기 위한 목적임으로 내용 상에 오류가 있을 수 있음을 밝힙니다.





TCP 서버 프로그램 작성 절차







1. socket() : 소켓의 생성, 서버도 클라이언트와 마찬가지로 통신을 위한 소켓을 생성

1
socket(PF_INET, SOCK_STREAM, 0);




2. bind() : 소켓 번호와 소켓 주소를 연결한다.


1
2
3
4
int bind(int s, struct sockaddr *addr, int len);
//int s : 소켓번호
//struct sockaddr *addr : 서버 자신의 소켓주소 구조체 포인터
//int len : *addr 구조체의 크기


- socket 함수로 생성된 소켓번호는 응용 프로그램만 알고 있으므로 외부와 통신하기 위해 소켓번호와 소켓주소를 연결해 두어야한다.


- bind()가 필요한 이유 : 클라이언트가 서버 프로그램의 특정 소켓으로 접속하려면 서버는 자신의 소켓번호와 클라이언트가 알고 있는 자신의 IP 주소, 포트번호를 미리 연결해 두어야한다.


- bind()는 성공시 0, 실패시 -1을 리턴한다.



○ bind() 사용 예

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#define SERV_IP_ADDR "192.168.0.1"
#define SERV_PORT 5000
 
s=socket(PF_INET, SOCK_STREAM, 0);
struct sockaddr_in server_addr;
//소켓 생성
 
server_addr.sin_family=AF_INET;
server_addr.sin_addr.s_addr=inet_addr(SERV_IP_ADDR);
//server_addr.sin_addr.s_addr=htonl(INADDR_ANY);
server_addr.sin_port=htons(SERV_PORT);
//소켓 구조체의 내용
//INADDR_ANY : 서버가 자신의 IP주소를 자동으로 긁어와 사용하게한다.
 
bind(s, (struct sockaddr *)&server_addr, sizeof(server_addr));
//소켓번호와 소켓주소를 bind
 



3. listen() : 소켓을 수동대기 모드로 바꾸어준다.


1
2
3
int listen(int s, int backlog);
//int s : 소켓 번호
//int backlog : 연결을 기다릴 수 있는 클라이언트의 최대 수

- 클라이언트가 listen()을 호출해 둔 서버 소켓을 목적지로 connect()를 호출
(여기서 3-way 핸드쉐이크가 발생한다. 연결확인)

- 시스템이 핸드쉐이크를 마친 후에는 서버 프로그램이 설정된 연결을 받아들이는 과정으로 accept()가 사용됨

- accept()는 한번에 하나의 연결만 가능. 

- listen()는 성공시 0, 실패시 -1을 리턴한다.



4. accept()
- 서버에서 listen() 호출 후 실제로 클라이언트와의 통신을 시작하기 위해 사용

1
2
3
4
int accept(int s, struct sockaddr *addr, int *addrlen);
//int s : 소켓 번호
//struct sockaddr *addr : 연결 요청을 한 클라이언트의 소켓주소 구조체
//int *addrlen : *addr 구조체 크기의 포인터


- 함수가 성공적으로 실행되면 통신에 사용할 새로운 소켓이 생성된다. (실패시 -1 리턴)


- 서버는 클라이언트와 통신하기 위해 새로 만들어진 소켓번호를 사용


- 연결된 클라이언트의 소켓주소 구조체와 소켓주소 구조체의 길이의 포인터를 리턴

(addr, addrlen 인자로 리턴, 서버는 addr 을 통해 클라이언트의 IP 주소를 확인 가능)





저작자 표시 비영리 변경 금지
신고
공유하기 링크
태그 클라우드
, , , ,
프로필사진

Yowu (Yu Yongwoo)

My MBTI type is ENTP. (Of course I do not believe it 100%, but I want to do that) I use Node.js to develop the backend. I use Ubuntu Linux as my development environment, and I love Vim. I am interested in open source and are keen to contribute. I have a bachelor's degree in computer science from Catholic University and now a software engineer at Plating Inc., I spent about 5 years developing and learning, and I am still interested in software development and culture. Recently, I am interested in React, Serverless structure, Domain Design Driven. Sometimes I play drums in the band.