tcp client 예제

TCP 클라이언트를 아래와 같이 수정하여 서버와 5개의 연결을 설정한 다음 str_cli 호출에서 첫 번째 클라이언트(sockfd[0])만 사용합니다. 여러 연결을 설정하는 목적은 동시 서버에서 여러 자식을 생성하는 것입니다. 클라이언트는 소켓을 호출하고 TCP의 3방향 핸드셰이크를 일으키는 연결을 연결합니다. 3방향 핸드셰이크가 완료되면 클라이언트의 반환을 연결하고 서버에서 반환을 수락합니다. 연결이 설정됩니다. 다음 단계가 수행됩니다: 이 예제에서 신호를 잡는 네트워크 프로그램을 작성할 때 중단된 시스템 호출을 인식해야 하며 이를 처리해야 한다는 것을 알고 있습니다. 이 예제에서는 표준 C 라이브러리에 제공된 신호 함수로 인해 중단된 시스템 호출이 커널에 의해 자동으로 다시 시작되지 않습니다. 일부 다른 시스템은 중단된 시스템 호출을 자동으로 다시 시작합니다. 4.4BSD에서 동일한 예제를 실행하는 경우 신호 기능의 라이브러리 버전을 사용하여 커널이 중단된 시스템 호출을 다시 시작하고 수락해도 오류가 반환되지 않습니다. 서로 다른 운영 체제 간에 이러한 잠재적인 문제를 처리하는 것은 당사가 자체 버전의 신호 함수를 정의하는 이유 중 하나입니다. 【p134】 그런 다음 동일한 호스트에서 클라이언트를 시작하여 서버의 IP 주소127.0.0.1(루프백 주소)을 지정합니다. 서버의 일반(루프백이 아닌) IP 주소를 지정할 수도 있습니다.

이 예제의 문제는 FIN이 소켓에 도착할 때 클라이언트가 fgets 호출에서 차단된다는 것입니다. 클라이언트는 실제로 두 개의 설명자, 소켓 및 사용자 입력으로 작업하고 있습니다. 두 소스 중 하나에서만 입력을 차단하는 대신 두 소스 중 하나에서 입력을 차단해야 합니다. 실제로, 이것은 6장에 설명된 선택 및 폴링 기능의 한 가지 목적이다. 3방향 핸드셰이크가 완료되고 연결이 설정된 다음 클라이언트 TCP가 RST(재설정)를 보냅니다. 서버 측에서는 연결이 TCP에 의해 큐에 대기되어 서버 프로세스가 RST가 도착할 때 수락을 호출할 때까지 대기합니다. 언젠가 서버 프로세스 호출이 수락됩니다. TCP/IP 클라이언트는 편리한 기능 create_connection()를 사용하여 서버에 연결하여 몇 단계를 저장할 수 있습니다. 이 함수는 하나의 인수, 서버의 주소를 포함하는 두 값 튜플을 사용하며 연결에 사용할 최적의 주소를 파생합니다. 이제 이전 장의 기본 함수를 사용하여 전체 TCP 클라이언트/서버 예제를 작성합니다. 간단한 예는 다음 단계를 수행하는 에코 서버입니다. 프로세스가 종료되면 열려 있는 모든 설명자가 닫힙니다(단계 순서는 서버 프로세스 종료와 동일합니다).

클라이언트에서 선택 또는 폴링 기능을 사용하여 클라이언트가 서버 프로세스가 종료되는 즉시 이를 감지하도록 해야 합니다. 우리는 같은 호스트에서 클라이언트와 서버를 실행하기 때문에, netstat는 이제 TCP 연결에 해당하는 출력의 두 개의 추가 라인을 보여줍니다 : 우리는 지금 우리의 클라이언트 / 서버를 시작한 다음 서버의 충돌을 시뮬레이션 서버 자식 프로세스를 죽일 것입니다 프로세스.