우선 헤더파일 선언.....
#include <sys/socket.h>
#include <sys/stat.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <string.h>
#Include <unistd.h>
sys/socket.h 헤더파일은 socket()함수, bind()함수, listen()함수, accept()함수를 사용하기 위해 선언을 해준다..sys/socket.h 헤더파일 내부에 socket(), bind(), listen(), accept()함수들의 정의부분이 선언이 되있기 때문에 굳이 정의를 할 필요가 없다.string.h 헤더파일은 memset(), bzero() 함수. 메모리를 초기화 해주는 함수를 사용하기 위해선언.unistd.h 헤더파일은 read(), write(), close() 함수를 사용하기 위해선언main문은 실행시 인자를 받을수 있게 argc, argv[]가 매개변수로 되어있다. 여기서 인자는... 바로 포트번호가 되겠다. 사용자가 원하는 포트를 열수 있게끔 ./파일이름 포트번호 이렇게 실행을하게 된다.....
11~14 행
inr server_sockfd, client_sockfd; 서버와 클라이언트의 소켓 지정 번호를 저장 하는 변수int client_len,n ; 클라이언트의 길이를 저장하는 변수char buf[MAXBUF]; 전송을 주고 받을수 있는 최대 길이, MAXBUF값이 1024이므로 1024개의 문자 만큼 받을수 있다.
16행
client_len= sizeof(clientaddr); 클라이언트의 길이를 저장, 어차피 struct sockaddr_in의 구조체에 저장 되있는 변수들의 총 합의 메모리 크기만큼 저장이 된다.
18~22행
if((server_sockfd = socket(AF_INET,SOCK_STREAM, IPPROTO_TCP))==-1)서버 소켓을 생성한다 만약 소켓 생성이 실패 했다면 "socket error : " 문구를 띄어주고 종료를 시킨다.exit를 주석 처리를 하였는데 waring이 뜨길래 보기 싫어서 그냥 주석 처리 시킴.... ㅋㅋㅋㅋ
24행
bzero(&serveraddr, sizeof(serveraddr)); 메모리 초기화
25~28행
7행 듣기 소켓이 쓸 IP 주소와 도메인 형식 포트번호를 설정한다serveraddr.sin_family=AF_INET; 도메인을 설정한다 Ipv4사용serveraddr.sin_addr.s_addr=htonl(INADDR_ANY); 모든 주소에 대해 연결을 기다힘.. INADDR_ANY 부분에다가 특정 IP를 적어주면 특정 아이피만 접속이 가능.... 오 그럼 여기다가 특정 IP만 접속이 안되게도 할수 있겠구나.....맥주소도 가능한가?- 이부분 좀더 알아봐야겠다...serveraddr.sin_port=hrons(atoi(argv[1])); 서버를 여는 유저가 직접 포트 번호를 할당해준다 해당 프로그램 이름을 echo_server이기떄문에 실행시 ./echo_server 3500 이렇게 해주면 3500번 포트로 에코서버가 열어진다.bind(server_sockfd, (struct sockaddr *)&serveraddr, sizeof(serveraddr)); 설정값들을 정의해준다.
30행
listen(server_sockfd,5); 수신 대기열이 5인 대기열 생성
31~48행
while(1) 클라이언트로부터 상시 연결을 요청 받으므로 루프를 돌려준다memset(buf, 0x00, MAXBUF); 사용하기 전에 buf 변수를 초기화를 해준다.client_sockfd =accept(server_sockfd, (struct sockaddr *)&clientaddr, &client_len); accept 함수는 수신대기열에 클라이언트 연결이 있는지 확인. 있다면 읽어들인후 연결소켓 생성.printf("NEW Client Connect : %s \n", inet_ntoa(clientaddr.sin_addr));if((n = read(client_sockfd, buf, MAXBUF)) <= 0) 연결소켓으로 부터 MAXBUF에 해당하는 크기까지 데이터를 읽어들여서 buf에 저장반환이 실패했다면 close(client_sockfd); 연결소켓 종료if(write(client_sockfd, buf, MAXBUF)<=0)) write()함수로 buf의 내용을 클라이언트에게 전송close(client_sockfd) 연결소켓 종료
49행
close(server_sockfd); 듣기 소켓 종료
댓글
댓글 쓰기