요즘 응용프로그램을 짤때 서로다른 프로토콜을 사용하는 서로 다른 2개이상의 소켓을 사용해서 구현하는게 일반적이다.예를 들어 비디오 실시간 서비스를 하는 서버가 있을때 로그인 같은 경우엔 신뢰성 서비스가 필요하므로 TCP로 구현하지만 실시간 스트리밍 같은 경우에는 빠른 전송을 해야하고 굳이 재전송을 할 필요가 없으므로 UDP를 사용해서 구현한다. block I/O -> 읽어야할 데이터가 없으면 블락된 상태로 기다린다. recvfrom은 블락킹 I/O model의 한 예이다.(read와 사용법이 거의 유사)recvfrom을 호출했을때 커널로 제어가 넘어가게 되는데 이때 커널의 네트워크 패킷 버퍼에 데이터가 없으면 블락 된다. 커널은 하드웨어 네트워크 인터페이스에 데이터가 있는경우 하드웨어 인터럽트 루틴을 통..
첫번째 경우. 서버가 Crashing된 경우 이 경우 클라이언트는 서버가 Crashing 됬는지 안됬는지 바로는 알 수 가없다.그 서버에 가장 가까이 붙어있는 라우터가 그 서버가 Crashing됬다는걸 제일 빨리 알게 되고 라우팅 테이블이 인접 라우터들에게 전송되면서 결국에는 전세계 라우터들에게 전파되기 때문에 클라이언트에게 가장 가까운 라우터가 결국에는 그 ip주소로는 못간다고 알게 되기 때문에 언젠가는 알게된다. 근데, 이런 방법은 알게 되기 까지 시간이 상당히 걸린다. 따라서, 우리 프로그램의 경우에서 바로 알 수 있는 방법이 있다.Fgets한다음에 Write를 하고 나서 read에서 블락되어 있을텐데 이때 상대방으로 부터 아무 반응이 없을 것이고(FIN도 안오고 RESET도 안옴) 그렇기 때문에 ..
블락 될수있는 시스템콜이 순서대로 동작하게끔 프로그램을 짜게 되면 문제가 발생할 확률이 존재한다.위의 프로그램은 서버에 데이터를 보낼때 write를 두번에 나눠서 한다.첫번째 write에서 서버 프로세스가 이미 종료되어서 RST메세지를 서버로부터 받게 되며(그 메세지를 받기 위한 시간이 필요하므로 sleep(1)이 필요하다)두번째 write로 RST된 클라이언트 커넥트 소켓에 한번더 write를 하게 될경우 SIGPIPE 시그널이 발생한다는것을 실험하기 위한 프로그램이다. 1. hi there를 입력할시 hi there가 정상적으로 서버로부터 에코됨.2. 그 이후에(while문 한번 돌고 나서) 서버 자식 프로세스를 kill해봄.3. 클라이언트는 서버로부터 FIN메세지를 받음.4.그상태에서 Fgets를 ..
우리가 여태까지 만들었던 concurrent서버에서는 서버의 커널에 incomplete큐와 complete큐가 클라이언트의 요청정보를 담는다고 했었다.그런데, 서버프로그램의 경우에 3-way핸드쉐이킹을 끝마친 클라이언트의 요청은 complete큐에 담기게 된다.매우 바쁜 서버의 경우에 이 큐가 꽉차게 될경우가 매우 빈번히 생길수 있고 그렇게 될 경우 클라이언트 입장에서는 반응성이 매우 떨어진다. 서버와 클라이언트가 통신중이라고 가정하자.이때, 클라이언트가 SYN 서버가 SYN+ACK 다시 클라이언트가 ACK를 보냈을때 ACK를 받은 서버는 incomplete 큐에 있던 클라이언트의 연결 요청 정보를 complete큐에 옮겨 담게 된다. 그러고 나서 서버프로그램에서 complete큐에 있는 그 요청 정보를..
wait 시스템콜은 호출시 int형 변수에 자식 프로세스가 종료될 당시의 상태를 기록하고 그 죽은 자식프로세스의 pid를 리턴한다.자식 프로세스가 종료 됬는데 부모 프로세스가 자식 프로세스를 wait 하고있지 않은 경우에는 커널이 완전히 자식 프로세스를 free시키지 않고 메모리에 소량의 정보를 가지고 있다. 그렇기 때문에 자식은 좀비 프로세스가 된다. 따라서 시그널핸들러를 부모 프로세스에 작성해서 자식 프로세스가 죽었을때 완전히 메모리 free시키도록 해야한다. 한마디로 fork()를 하면 어디선가 wait()를 꼭해줘야한다. for( ; ;) {int stat;connfd = accept();if((n=fork()) == 0){//자식 프로세스 처리}close(connfd);wait(&stat); }..
위는 시그널 함수의 원형이다.Sigfunc는 커널이 실행할수 있도록 만들어 놓은 프로시져이다. (함수포인터) signal함수가 정상적으로 리턴되면 Sigfunc형 포인터이다. 어떤 함수를 가리키는 포인터이다라고 생각하면 될것같다. signal함수는 소프트웨어 인터럽트라고도 불린다. 어떤 프로세스에서 다른 프로세스에게 어떤 이벤트가 발생했다는것을 알려주기 위해서 시그널을 사용하기 때문에 그렇게 불린다. 또는 커널이 프로세스에게 인터럽트를 걸기도 한다. int kill(pid_t pid, int sig);(죽일 프로세스 아이디, 시그널 종류) 자식 프로세스가 죽었을때 SIGChild라는 이벤트가 발생하는데 커널이 이 이벤트가 발생하게 되면 signal 함수로 등록해 놓았던 시그널 핸들러를 실행시킨다.(이것을..
str_cli함수는 사용자로부터 입력을 받아서 서버에게 보내고, 서버는 받은 문자열을 그대로 돌려주고 그 돌려준 문자열을 다시 화면에 출력하게 된다.Readline은 내부적으로 read시스템콜을 사용하게 되는데, read시스템콜은 상대방으로부터 EOF(End of File)이벤트가 발생했을때 0을 리턴하게 된다. EOF이벤트는 상대방이 FIN메시지를 보냈을때 발생하게 된다. Ctrl+D를 누르게 되면 EOF이벤트가 발생하게 되고 그렇게 되면 Fgets는 NULL을 리턴하게 된다. 그렇게 되면 반복문이 종료되고 str_cli함수가 종료되게 되면 그다음 exit(0)를 호출해서 상대방에게 FIN메시지를 보내게 된다. 서버 프로그램과 클라이언트 프로그램을 같은 기계에서 실행시키는 상황을 생각해보자.서버 프로그..
- Total
- Today
- Yesterday
- async
- useEffect
- state
- computed
- design system
- reducer
- type alias
- Action
- atomic design
- es6
- Next.js
- reflow
- useRef
- server side rendering
- Babel
- await
- promise
- react
- reactdom
- webpack
- Polyfill
- props
- storybook
- mobx
- hydrate
- rendering scope
- react hooks
- return type
- typescript
- javascript
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |