티스토리 뷰
반응형
* 본 포스팅은 한국소프트웨어진흥원 출처의 리눅스 네트워크 프로그래밍 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 주소를 확인 가능)
반응형
'개인공부 > 소켓 프로그래밍' 카테고리의 다른 글
리눅스 소켓 프로그래밍 09 : TCP 서버 프로그램 예제 (3) | 2014.02.17 |
---|---|
리눅스 소켓 프로그래밍 07 : TCP 클라이언트 프로그램 예제 (0) | 2014.02.08 |
리눅스 소켓 프로그래밍 06 : TCP 클라이언트 작성절차, 함수 (0) | 2014.02.07 |
리눅스 소켓 프로그래밍 05 : IP, 도메인 주소변환 (3) | 2014.02.03 |
리눅스 소켓 프로그래밍 04 : 소켓주소 구조체 (0) | 2014.02.02 |
리눅스 소켓 프로그래밍 03 : 디스크립터 확인 예제 (2) | 2014.02.02 |
리눅스 소켓 프로그래밍 02 : 소켓 socket() 함수 (3) | 2014.02.02 |