TCP 고객, 서버(fork식)

2432 단어

정상 가동

tcpserver &

netstat-a를 사용하여 관찰할 수 있습니다. 플러그인을 감청하는 state는 LISTEN이어야 합니다. 연결을 만든 후에 새로운 연결을 볼 수 있습니다.

정상 중지


클라이언트가 중단 명령을 실행하여 FIN_ 에 들어갑니다.WAIT_1 상태(FIN 발송), 서버에 수락된 ACK가 FIN_WAIT_2, 서버에 FIN을 수락하고 ACK를 전송하면 TIME_WAIT, 2MSL을 기다린 후 정식으로 종료합니다.
참고:
하면, 만약, 만약...WAIT_1 상태 시 FIN(서버 종료 요구)이 수신되면 ACK를 보내고 Closing 상태로 들어가고 서버의 ACK를 받으면 TIME_WAIT 상태.
하면, 만약, 만약...WAIT_1 상태가 FIN 및 ACK(서버 응답 끄기 및 끄기 요청)에 수락되면 ACK를 보내 TIME_로 바로 이동합니다.WAIT 상태.
서버가 클라이언트로부터 FIN을 받은 후 ACK를 보내고 CLOSE_WAIT 상태, 이후 서버에서도 FIN 전송, LAST_ACK 상태, 클라이언트의 ACK를 수락한 후 정식으로 닫습니다.

하위 프로세스


하위 프로세스가 종료되면 SIGCHLD 신호가 전송되지만 부모 프로세스는 기본적으로 처리되지 않으며 하위 프로세스는 경직되어 자원이 회수되지 않습니다.프로세스가 끊어지면 모든 하위 프로세스가 경직되어 부모 프로세스에 맡겨집니다.처리 방법:wait 함수를 호출하여 신호 처리 함수를 설정할 수 있습니다.하위 프로세스가 종료되면 이 신호를 부모 프로세스에 보내고 연결된 신호 처리 함수를 실행합니다.부모 프로세스가 중단되었을 때 시스템 호출 (예: accept) 에 막혀 있다면, accept는 EINTER 오류를 되돌려줍니다. 부모 프로세스는 이 값을 처리해야 합니다.(SA_RESTART 플래그를 설정하여 중단된 시스템 호출을 자동으로 재부팅할 수 있음)

신호


일단 신호 처리 함수가 설치되면 계속 설치되어 있다.이 신호를 처리할 때, 이 신호는 막힌 (즉 다시 이 신호를 일으킬 수 없음) 동시에sa_를 설정할 수 있습니다mask, 그 중에서 지정한 신호도 막힙니다.만약 신호가 막힐 때 여러 번 발생하지만, 막힌 것을 풀면 한 번만 더 유발할 수 있다.

신호 처리 함수

void handler(int signo);

signal

void (*signal(int signo, void (*func)(int))) (int);

typedef void Sigfunc(int);

Sigfunc signal(int signo, Sigfunc *func);

경직자 프로세스를 정확하게 처리하다


신호 처리 함수에서wait를 호출하면 한 번에 한 개의 하위 프로세스만 정리할 수 있지만 여러 개의 하위 프로세스가 동시에 사망할 수 있습니다. 그러면 처리할 수 없습니다. (신호 처리 함수가 실행될 때 여러 번 이 신호를 한 번만 기억하기 때문입니다.)신호 처리 함수에서waitpid 및 WNOHANG 옵션을 사용해야 합니다.
while((pid = waitpid(-1, &stat, WNOHANG)) >0)
    //  

특수한 상황


accept 반환 전 연결 종료


세 번의 악수가 끝난 후 클라이언트가 RST를 보낸 것이다.이런 상황은 운영체제가 다르면 차이가 있다. 커널에서 처리하거나 서버 프로세스가 보이지 않거나 EPROTO나 ECONNABORTED로 되돌아간다.

서버 프로세스 종료


예를 들어kill이 서버 프로세스를 떨어뜨리면 클라이언트에게 FIN을 보냅니다. 클라이언트에게 서버는 데이터를 더 이상 보내지 않을 뿐입니다. 클라이언트가 write를 호출하면 서버는 RST에 응답하고 클라이언트가read를 호출하면 EOF로 돌아갑니다.

하면, 만약, 만약...


RST를 무시하고 계속 쓰면 커널이 프로세스에 SIGPIPE 신호를 보내게 됩니다. 이 신호의 기본 동작은 프로세스를 종료하는 것입니다.

서버 호스트 충돌


클라이언트가 read를 호출하면 차단되고 최종적으로 ETIMEOUT 또는 EHOSTUNREACH 또는 ENETUNREACH를 얻을 수 있습니다.

서버 호스트 충돌 후 재부팅


이전의 모든 링크 정보를 잃어버렸기 때문에 서버는 RST에 응답합니다(클라이언트가 ECONNRESET를 받았습니다).

좋은 웹페이지 즐겨찾기