본문 바로가기
코스웨어/15년 스마트컨트롤러

20150818-16번-박태인-일일업무일지 - select 함수로 입출력 다중화 구현

by 알 수 없는 사용자 2015. 8. 18.
728x90
반응형


네트워크

select 함수로 입출력 다중화 구현


위 그림은 select 함수의 man page 일부이다.

select 함수는 여러 파일 중 어떤 파일에 데이터 변화가 생겼는지 알려줘서, 작업 파일을 선택 할 수 있도록 해준다.

우선 select 함수를 살펴 보면 fd_set 이라는 type을 볼 수 있다. 이것은 C 의 자료형이 아닌 network를 위한 새로운 타입이다. fd_set비트 필드로 소켓에 데이터 변화가 있으면 해당 소켓에 대응되는 필드에 1을 설정한다.

readfds는 읽을 데이터가 있는지 검사하기 위해, writefds는 쓸 데이터가 있는지 검사하기 위해 사용한다.

fd_set의 크기를 알아 보기 위해 아래와 같이 프로그래밍 하면 결과는 아래와 같다.



128byte(=1024) bit 이다. , 최대 1024개의 파일을 관리 할 수 있다. 소켓 프로그래밍으로 말하자면 동시에 처리 할 수 있는 클라이언트 수가 1024개로 제한 된다. 또한 0번 필드는 파일 지정 번호가 0인 파일, 8번 필드는 파일 지정번호가 8인 파일로 고정되어 있다.

 

select 함수는 readfds, writefds, exceptfds에 등록된 파일 중 데이터 변화가 생긴 파일의 총 개수를 반환한다.

 

fd_set 관리를 위한 매크로 함수

select 함수의 핵심은 fd_set 관리에 있다. fd_set 관리는 결국 비트 연산이고, 이를 위해 다음 4가지 매크로 함수가 제공 된다.

1. FD_ZERO : fd_set을 초기화 한다. ( 모든 플래그 값을 0 으로 채운다.)

2. FD_SET : 1023 bit , 원하는 자리를 1SET

3. FD_ISSET : fds에 포함된 파일에 데이터 변화가 있는지를 확인한다.

4. FD_CLR : SET의 반대 개념으로 원하는 자리를 0 으로 클리어.


- 예제 -


- if문과 else문을 거친 후에 FD_SET으로 fd_set으로 0번 째 자리(stdin)1setting 해 줌으로써 select 호출 시 키보드의 입력을 감시하게 됨. [cf) stdout - 1, stderr - 2]

- select 함수의 첫 번째 인자는 가장 큰 감시대상 번호의 +1을 해서 넣는다.

- selectscanf 와 같은 blocking 함수인데 blocking이 풀리려면 2,3,4번째 인자인 readfds, writefds, exceptfds 중에 하나라도 event가 발생해야 한다. 여기서 0을 넣는 것은 감시를 하지 않는 다는 것을 의미한다. 마지막은 시간을 의미 하는데 여기에 0을 넣게 되면 event 발생 전 까지 무한 대기 하게 된다.

 ** 위 예제 소스 파일 입니다. **


main.c


- 교재 예제 -


timeval 구조체를 사용하여 위와 같이 시간을 설정해 주면 5초의 입력 시간을 지나쳐 버리면 Error 메시지를 띄우고, select blocking에서 빠져 나가게 된다.

** 교재 예제 source 파일 입니다. **


main1.c


- 결과물 -


select를 이용한 채팅 작성(미완성)

- client.c header 파일만 편집한 상태입니다.

Client.c



header 파일


**  server.c 와 client.c 그리고 selectchat.h 소스 파일 입니다.  **


client.c


selectchat.h


server.c





728x90