[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*)&구조체(강제 캐스팅), 구조체의 사이즈)
'프로그래밍 > 코딩(C & SOCKET)' 카테고리의 다른 글
[180508] Fast Change Directory (0) | 2018.05.08 |
---|---|
[151101] Raw Socket (0) | 2015.11.01 |
[150909] 리눅스 기반 채팅 chat_sv.c - 1 (0) | 2015.09.09 |
[150906] 리눅스 C언어 소켓 프로그래밍 (1) | 2015.09.06 |
[150903] C언어 포인터 기초 개념 (0) | 2015.09.05 |