본문 바로가기

프로그래밍/코딩(C & SOCKET)

[151025] 리눅스 디스크립터

반응형

[151025] 리눅스 디스크립터 (Descriptor)


 드디어 시험이 끝났다. 매일 같이 블로그에 포스팅 하시는 분들 보면 정말 대단하다는 생각이 든다. (..) 지난 번 포스팅에서 서버와 클라이언트를 구현해서 대화하는 프로그램을 포스팅 했는데, 잘 모르는 상태에서 검색을 하고 프로그램을 짜다보니 그저 소스 코드 옮겨 쓰기라는 느낌이 강하게 들었다. 사실상 지금 머리에 많이 남아있는 것도 없는 것 같다. 그래서, 한 번에 큰 프로그램 보다는 코드를 분할하여, 각 기능 별로 구분해서 포스팅 할 예정이다. 오늘은 " 파일 디스크립터 " " 소켓 " 이 주 개념으로 자리 잡을 것이다.




전체 소스다.


라인 별로 분석해보자.



 Line 1~6

 →  소켓이나 구조체 생성 등에 필요한 헤더파일이다.

 Line 13~16

 →  소켓과 관련된 함수들을 생성하고, 리턴 값을 각 변수에 저장해서 연결이나 생성에 실패할 경우 if 문으로 ERROR 처리를 할 수 있도록 한다.

 Line 18

 →  서버의 연결 정보 (IP, PORT, PROTOCOL) 등이 저장되는 구조체

 Line 22~25

 →  소켓 생성이 실패할 경우 -1을 리턴한다. if 문 처리를 통해 어느 부분에서 ERROR가 발생했는지 알 수 있다.

 Line 27~30

 →  memset 함수로 구조체를 초기화 시킨다. 이후 구조체의 각 멤버 변수들을 참조하는 방법으로 Protcol, IP, Port를 설정해준다.

 →  INADDR_ANY 는 모든 IP 주소를 수용한다는 의미다.

 Line 32~37

 →  소켓 정보와 인터넷 연결 정보를 묶는(bind)과정이다. 바인딩을 해줘야만 외부 통신이 가능해진다.

 →  마찬가지로 분기문 처리를 통해서 ERROR 위치를 파악할 수 있다.

 Line 39~41

 → 위 과정으로 파일 디스크립터 socket_number 번 째에 소켓이 등록된다.

 →  출력문을 보면 할당에 성공했다고 나온다.

 →  이 후에는 파일 디스크립터의 변화를 감지해서 해당 소켓으로 이동해 처리를 하는 방식으로, 다양한 작업이 가능해진다.

 →  리눅스 파일 디스크립터의 0, 1, 2번은 사전에 등록이 돼있는데, 0번은 표준 입력, 1번은 표준 출력, 2번은 표준 에러를 의미한다.

 →  예를 들어, 파일 디스크립터의 변화를 감지하는 코드가 작동 되고 있고, 0번에서 변화가 감지되면 해당 소켓으로 이동해서 입력 작업을 한다던지 하는 방식으로 이용할 수 있다.


주요 함수들을 정리해보자.


1. socket(프로토콜, 연결 방식, 0)

2.memset(서버 구조체, 채울 내용(0,x00), 구조체의 사이즈)

3.bind(구조체, (struct sockaddr*)&구조체(강제 캐스팅), 구조체의 사이즈)


반응형