12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394#include #include #include #include #include #include #include #include #include #define MAXLINE 4096#define SA struct sockaddr#define max(X,Y) ((X) > (Y) ? (X) : (Y))#define LISTENQ 5void str_echo(int sockfd){ssize_t n..
유디피 소켓 사용의 단점 1.TCP의 ack & 재전송 방식을 사용하지않는 비연결지향형 프로토콜인 UDP에서는 lost datagram이 생겼을때 프로그램상에서 별도의 처리를 해주어야 한다는 문제가 있음 ( 전송된 데이터가 유실됨 ) 클라이언트에서 서버로 sendto 한다음에 recvfrom에서 블럭되어 있는데 보낸 패킷이 lost되었을 경우 recvfrom에서 무한히 블럭되어 있을 가능성이 있다. 그렇기 때문에 이것을 해결하기 위해 select 또는 sigalram시그널핸들러를 통해서 타이머를 세팅해주어야 한다. 2.상대방이 보내온 데이터가 정말로 내가 원하는 상대방인지 별도의 장치를 사용하지 않으면 알 수 가없다. -> 서버쪽에서는 이런 문제가 상관이 없다. 클라이언트의 경우에는 udp소켓을 사용해서..
TCP소켓을 사용할때 TCP의 정의에서 네트워크 상황을 커널은 알지만 유저프로세스는 거의 모르거나 극히 일부로 제한되는 경우가 많다. 유저프로세스가 알게 되면 트랜스포트 계층(L4)에서의 일은 트랜스포트 계층에서 해야할 일만 규정하고 그것의 간섭을 다른 레이어에서 불필요하게 할수 없게 하도록 하기 위해서 이다. TCP의 상황이 어떤지를 알 수 있도록 제공이 되면(양 끝의 커널은 상당 부분 알게 된다, 중간 라우터에서 오류가 나더라도 ICMP메세지를 양 측 커널에 보내주기 때문에 커널은 에러 상황을 알 수 있다.) 좋겠다. TCP 프로토콜 자체에서는 정의되지 않은 일이지만 커널이 상당부분 TCP의 현황에 대해서 알 수 있으니까 유닉스에서는 시스템콜의 형식으로 tcp상황을 유저 프로세스가 알 수 있도록 소켓..
poll은 select 와 거의 유사하다.POLLRDNORM - 노말한 데이터가 들어 왔다는 이벤트를 의미한다.select는 소켓 이외의 파일도 readable 또는 writable을 검사 했지만 poll은 소켓에 대해서만 검사한다.그리고 어떤 이벤트가 발생했을때 깨어나야 한다는것을 매개변수로 설정할수 있다. select에서는 read라는 이벤트가 발생했을때 깨어나야할 소켓들은 read전용 보따리에 담고 write는 write 전용 보따리에 담았었다. 하지만 poll에서는 블락에서 깨어나는 이벤트를 소켓별로 따로따로 설정할 수 있다. 위의 프로그램은 앞 포스팅에서 사용했었던 에코 서버 프로그램인데 select를 poll로만 변경해 준것 이다. limits.h 헤더파일에 포함된 OPEN_MAX는 256으로..
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071#include “lnp.h”intmain (int argc, char **argv){ int i, maxi, listenfd, connfd, sockfd; int nready, client[FD_SETSIZE]; //client배열은 파일디스크립터 번호를 담는 크기 256의 배열 ssize_t n; //ssize_t == unsigned int fd_set rset, allset; //나중에 allset에서 rset으로 옮겨 담을것임./* allset과 rset??? ..
이 프로그램은 문제가 발생하지 않는 클라이언트 프로그램이므로 이 프로그램을 활용하면 웬만한 상황은 모두 커버할수 있다. 그렇기 때문에 거의 외우다 시피 알아두는것이 좋을것 같다. 먼저 for문 윗부분을 살펴보자.stdineof 라는것은 일종의 flag인데 클라이언트에서 파일을 읽다가 EOF가 발생하거나 키보드로부터 입력을 받다가 Ctrl+d가 입력 되어서 EOF가 발생하면 이 flag에 1이라는 값이 세팅 되게끔 만들어 놓은 것이다. stdineof == 0 이라는 것은 아직 클라이언트에서 EOF가 발생하지 않았다는 것이기 때문에 그 다음 줄에서FD_SET을 통해서 그 파일 디스크립터를 rset이라는 읽기 전용 파일 보따리에 추가해서 그 파일이 데이터를 읽을 준비가 됬는지를 검사하게 된다.stdineof..
시험문제 앞에서 설명했듯이 , watermark라는 옵션이 있다. 그 소켓을 사용하는 응용프로그램이 만약 100byte를 받아야만 의미가 있는 프로그램이라고 할때 커널 버퍼에 100바이트가 도착하기 전에는 read를 깨우지 않는다. 100byte가 모두 도착한 경우에만 블락에서 깨어나게끔 해서 쓸데없는 오버헤드를 줄인다. 위의 그림은 Readable,Writable,Exception 상황이 어떨때 발생하는지를 나타내고 있다. 즉, select에서 깨어나는 상황을 요약한 것이다. Readable한 경우 1. 커널 버퍼에 데이터가 도착한 경우2. 상대방으로 부터 FIN메세지가 도착한 경우3. (서버의 경우) 상대방으로 부터 연결 요청이 들어온 경우4. 오류가 발생한 경우 - 앞의 Connection Abor..
select 시스템콜이 0보다 큰 값을 리턴하면 , 0이면 타임아웃, -1이면 에러이다. Select가 양의 정수를 리턴하는 상황select시스템콜은 정상리턴할때 read보따리 write보따리 등에 들어있는 소켓이 I/O가 가능한 상태가 되면 그 가능해진 소켓의 숫자를 리턴한다. Select가 0을 리턴하는 상황select의 마지막 인자로 넣은 시간동안 소켓보따리의 소켓이 I/O준비가 됬는지 검사하다가 타임아웃 되는 순간 0을 리턴시킨다.마이크로 세컨드는 10의-6승인데 실제로는 마이크로 세컨드 기준으로 시간을 조절하기는 힘들다. select가 -1를 리턴하는 상황select에서 블락되어있는 상태에서 시그널 핸들러가 호출되면 그 블락 시스템콜이 이상한값을 리턴할 가능성이 있으므로앞에서 그 블락 시스템콜을..
- Total
- Today
- Yesterday
- react hooks
- Action
- atomic design
- javascript
- hydrate
- useEffect
- mobx
- storybook
- reducer
- react
- props
- await
- state
- reactdom
- Babel
- reflow
- async
- useRef
- typescript
- return type
- rendering scope
- Next.js
- webpack
- design system
- promise
- Polyfill
- computed
- es6
- server side rendering
- type alias
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |