본문 바로가기
Network/HTTP

HTTP 서버

by 수픽 2020. 3. 9.

1. 헤더 파일과 필요 요소들

 

sockaddr_in 구조체와 socket이 각각 2개씩 필요하다.

윈속 초기화

 

2. socket()

sockSvr 소켓을 AF_INET(IPv4), 소켓과 소켓이 일대일로 계속 연결되게 유지해주는 연결지향으로 설정해준다. 생성된 소켓은 아직 주소와 포트가 연결되지 않았다.

 

여기서 AF_INET과 PF_INET의 차이점은 프로토콜 체계  (Protocol Familly)를 설정하느냐, 주소 체계 (Address Familly)를 설정하느냐에 따라 달라진다고 한다. SOCKET() 함수의 프로토콜 패밀리에 AF_INET을 넣어도 되지만 PF_INET이 바람직하고, STRUCTADDR_IN 구조체에 주소 체계를 넣을 때 PF_INET을 넣어도 되지만 AF_INET을 넣는게 바람직하다고 한다.

 

AF_INET, 233번 포트, INADDR_ANY로 소켓 정보를 초기화해준다.

 

3. bind()

bind()함수는 sockSvr소켓에 서버의 IP주소와 PORT번호를 지정해준다. 소켓을 통신에 사용할 수 있는 준비가 된다. 이때 생성한 socket을 server socket으로 등록한다.

 

sockSvr 소켓에 주소와 port를 할당하기 위해 sockaddr_in 구조체를 이용한다. 마지막으로 두 번째 인자로 전달된 구조체 변수의 길이정보를 받아온다.

4. listen()

sockSvr로 들어오는 클라이언트의 요청을 최대 5개 까지 기다린다.

 

send()함수로 보낼 응답용 HTTP 메세지를 작성한다. 사이트에 출력할 메세지가 보인다.

 

memset 함수는 어떤 메모리의 시작점부터 연속된 범위를 어떤 값으로 모두 지정하고 싶을 때 사용하는 함수이다. 시작 주소, 메모리에 채우고자하는 값, 채우고자 하는 메모리의 크기를 인자로 받는다.

void * memset ( void * ptr, int value, size_t num );

 

snprintf 함수는 printf와 비슷하지만, 버퍼로 사용될 변수로 출력이 된다는 점이 다르다. char *로 선언된 변수 안에 입력된 내용이 문자열로 담기게된다. 버퍼 오버플로우를 막기 위해 문자열의 길이를 지정한다. '...'은 가변 파라미터를 가진다는 의미이다. 해당하는 곳에 인자가 없어도 되고 여러개가 되어도 받을 수 있다.

int snprintf (char *buffer, int buf_size, const char *format, ...)

 

5. accept(), send()/recv(), close()

accept() 함수로 sockSvr로 연결 요청이 온 클라이언트 소켓을 받아들인다. 클라이언트 소켓의 소켓번호가 반환되고, addrSockclt 구조체에 클라이언트의 ip 주소, port 번호가 저장된다.

 

recv() 함수로 sockSS 소켓으로 들어오는 데이터를 받아 szlnBuf에 저장한다. 그리고 받은 메시지를 cmd 창에 출력한다.

 

send() 함수로 받은 데이터를 클라이언트에게 보낸다. sockSS 소켓을 닫고 윈속을 종료하면서 프로그램이 끝난다.

 

6. 결과

실행창 빌드 시켜놓고

http://127.0.0.1:233/ 을 웹브라우저에 치면 서버가 뜬다.

 

실행창을 다시 보면 받은 메시지가 cmd 창에 뜬다.

 

'Network > HTTP' 카테고리의 다른 글

DDOS Generator 2  (0) 2020.03.30
Thread Pool  (0) 2020.03.22
멀티 스레딩  (0) 2020.03.16
Socket Programming  (0) 2020.03.02
DDOS KISA  (0) 2020.02.24