티스토리 뷰

alarm(5);를 호출.

 12번째 줄의 if문은 5초가 지났을때 실행되고 else문은 5초 이내에 데이터가 서버로부터 도착한 경우에 실행된다.

데이터가 5초 이내에 정상적으로 온 경우에는 알람을 그 즉시 꺼주어야 알람이 만료되어서 시그널 핸들러가 호출되는 일을 막을수있다.


이렇게 시그널을 통해서 타임아웃을 발생 시키는 일은 아주 경험이 많은 상태가 아니고선 지양하는게 좋다. 멀티 쓰레딩 환경에서 여러가지 오류를 일으킬 수가 있다.


select나 poll의 매개변수에 시간을 설정해서 타임아웃을 발생시키는게 제일 좋은 방법이다.


위의 함수는 sec이내에 원하는 데이터가 수신 되었는지를 확인하기 위한 함수이다.(select 활용)


소켓 옵션에 리시브 타이머를 설정해 놓을수있다. 소켓 종류에 상관없이 설정이 가능하다.

이것도 타이머를 설정하는 안정적인 좋은 방법이다.


Standard I/O를 통해서 socket read/write를 할수는 있으나 하지 않는게 좋다.


OS가 준비 해놓은 버퍼가 수천byte이다. 이 수천 byte중 어느정도 데이터가 찼을 때만 스탠다드 I/O로 소켓 read/write를 실행한다.

에코 서버 프로그램에서 read 한다음 write를 실행 하는데,


read/write 대신에 fgets,fputs를 소켓에 대해서 실행해도 동작은 하지만 약간 이상하게 동작한다. 여러 에러케이스가 존재함.

얼핏 보기엔 맞는거 같지만 실제론 오동작 하는것이다.


fgets,fputs등 표준 입출력 함수에에 대해 운영체제에서 버퍼링을 하기 때문에, 버퍼가 꽉차거나 운영체제가 flush를 하는 상황이 발생 할 수 있다.

이런 상황이 발생할때만 실제로 데이터를 쓰거나 읽는다.


표준 입출력 함수(fgets,fputs)를 디바이스 파일(키보드,모니터)에 대해서 실행하게 될 경우, 엔터를 기준으로 버퍼에 있는 데이터를 쓰거나 읽는것을 결정한다.


fgets(소켓)을 호출하고 나서 바로 fputs(소켓)을 호출하지 못한다. 입출력이 끝났다고 OS가 알게끔 해주어야 제대로 동작한다.


14.8절 시험





댓글
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함