티스토리 뷰

반응형



* 본 포스팅은 한국소프트웨어진흥원 출처의 리눅스 네트워크 프로그래밍 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)

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

최근에 올라온 글
최근에 달린 댓글
«   2024/03   »
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
31
글 보관함
Total
Today
Yesterday