> 백엔드 개발 > PHP 튜토리얼 > PHP_php 팁을 사용한 소켓 네트워크 프로그래밍 입문 가이드

PHP_php 팁을 사용한 소켓 네트워크 프로그래밍 입문 가이드

WBOY
풀어 주다: 2016-05-16 20:08:43
원래의
1233명이 탐색했습니다.

TCP/IP와 UDP가 무엇인가요?

TCP/IP(전송 제어 프로토콜/인터넷 프로토콜)는 광역 네트워크(WAN)용으로 설계된 산업 표준 프로토콜 세트입니다.
UDP(User Data Protocol, User Datagram Protocol)는 TCP에 해당하는 프로토콜입니다. 이는 TCP/IP 프로토콜 제품군의 구성원입니다.
​ ​ ​ 다음은 이러한 프로토콜 간의 관계를 보여주는 다이어그램입니다.

2015811151417312.jpg (596×448)

TCP/IP 프로토콜 제품군에는 전송 계층, 네트워크 계층 및 링크 계층이 포함됩니다. 이제 TCP/IP와 UDP의 관계를 알았습니다.
소켓은 어디에 있나요?
그림 1에서는 소켓의 그림자가 보이지 않는데 소켓은 어디에 있나요? 사진이 스스로 말하도록 합시다.

2015811151446490.jpg (542×476)

여기에 소켓이 있는 것으로 밝혀졌습니다.
소켓이란?
소켓은 애플리케이션 계층과 TCP/IP 프로토콜 제품군 간의 통신을 위한 중간 소프트웨어 추상화 계층입니다. 디자인 모드에서 소켓은 실제로 소켓 인터페이스 뒤에 복잡한 TCP/IP 프로토콜 제품군을 숨기는 파사드 모드입니다. 사용자에게는 소켓이 지정된 요구 사항을 충족하도록 데이터를 구성할 수 있는 간단한 인터페이스 집합이 있습니다.
사용할 수 있나요?
이전 세대가 우리를 위해 많은 일을 해줬고, 네트워크 간의 통신도 훨씬 단순해졌지만, 결국 아직 해야 할 일이 많습니다. 이전에 소켓 프로그래밍에 대해 들었을 때 상대적으로 고급 프로그래밍 지식이라고 생각했습니다. 그러나 소켓 프로그래밍의 작동 원리를 이해하는 한 미스터리는 풀릴 것입니다.
인생의 한 장면. 친구에게 전화를 걸려면 먼저 전화번호를 누르세요. 친구가 벨소리를 듣고 나면 친구와 연결되어 통화할 수 있습니다. 통화가 끝나면 전화를 끊어 통화를 종료하세요. 삶의 장면은 이것이 어떻게 작동하는지 설명합니다. 아마도 TCP/IP 프로토콜 계열이 삶에서 탄생했을 수도 있지만 반드시 그런 것은 아닙니다.

2015811151507191.jpg (478×491)

PHP 소켓 프로그래밍 개요
php5.3에는 PHP가 소켓 통신 기능을 가질 수 있도록 하는 소켓 모듈이 함께 제공됩니다. 특정 API에 대해서는 공식 매뉴얼(http://php.net/manual/zh/function.socket-create)을 참조하세요. 특정 구현은 c를 따릅니다. 메모리 할당 및 네트워크 바이트 순서 변환과 같은 기본 작업

이 없다는 점을 제외하면 매우 유사합니다.

동시에 PHP의 pcntl 모듈과 posix 모듈은 기본 프로세스 관리, 신호 처리 및 기타 운영 체제 수준 기능을 실현할 수 있습니다. 여기에는 pcntl_fork()와 posix_setsid()라는 두 가지 핵심 함수가 있습니다. 프로세스를 분기()하는 것은 실행 중인 프로세스의 복사본을 만드는 것을 의미하며 복사본은 하위 프로세스로 간주되고 원본 프로세스는 상위 프로세스로 간주됩니다. fork()가 실행된 후에는 이를 시작한 프로세스 및 터미널 제어에서 분리될 수 있으며 이는 또한 상위 프로세스가 자유롭게 종료될 수 있음을 의미합니다. pcntl_fork() 반환 값, -1은 실행 실패를 나타내고, 0은 하위 프로세스를 나타내고, 0보다 큰 것은 상위 프로세스를 나타냅니다. 먼저 새 프로세스를 새 세션의 "리더"로 만들고 마지막으로 프로세스가 더 이상 터미널을 제어하지 않게 만듭니다. 이는 데몬 프로세스가 되기 위한 가장 중요한 단계이기도 합니다. 즉, 터미널이 닫힐 때 프로세스가 강제로 종료되지 않습니다. 이는 중단할 수 없는 상주 프로세스에 대한 중요한 단계입니다. 마지막 분기()를 수행합니다. 이 단계는 필수는 아니지만 일반적으로 수행됩니다. 가장 큰 의미는 제어 터미널을 얻는 것을 방지하는 것입니다.

데몬이란 무엇인가요? 데몬은 일반적으로 터미널을 제어하지 않는 백그라운드 작업으로 간주됩니다. 여기에는 세 가지 분명한 특징이 있습니다.

  1. 백그라운드에서 실행
  2. 시작한 프로세스에서 분리
  3. 단말기 제어가 필요하지 않습니다

가장 일반적인 구현 방법: fork() -> setid() -> 코드의 run_server() 메소드는 데몬 프로세스를 구현합니다.

서버측 소켓 모니터링 코드

  <&#63;php 
   
  // 接受客户端请求,回复固定的响应内容 
  function server_listen_socket ($address, $port) 
  { 
    $buffer = "Msg from wangzhengyi server, so kubi..."; 
    $len = strlen($buffer); 
     
    // create, bind and listen to socket 
    $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); 
    if (! $socket) { 
      echo "failed to create socket:" . socket_strerror($socket) . "\n"; 
      exit(); 
    } 
     
    $bind_flag = socket_bind($socket, $address, $port); 
    if (! $bind_flag) { 
      echo "failed to bind socket:" . socket_strerror($bind_flag) . "\n"; 
      exit(); 
    } 
     
    $backlog = 20; 
    $listen_flag = socket_listen($socket, $backlog); 
    if (! $listen_flag) { 
      echo "failed to listen to socket:" . socket_strerror($listen_flag) . "\n"; 
      exit(); 
    } 
     
    echo "waiting for clients to connect\n"; 
     
    while (1) { 
      if (($accept_socket = socket_accept($socket)) == FALSE) { 
        continue; 
      } else { 
        socket_write($accept_socket, $buffer, $len); 
        socket_close($accept_socket); 
      } 
    } 
  } 
   
  function run_server () 
  { 
    $pid1 = pcntl_fork(); 
    if ($pid1 == 0) { 
      // first child process 
       
      // 守护进程的一般流程:fork()->setsid()->fork() 
      posix_setsid(); 
       
      if (($pid2 = pcntl_fork()) == 0) { 
        $address = "192.168.1.71"; 
        $port = "8767"; 
        server_listen_socket($address, $port); 
      } else { 
        // 防止获得控制终端 
        exit(); 
      } 
    } else { 
      // wait for first child process exit 
      pcntl_wait($status); 
    } 
  } 
   
  // server守护进程 
  run_server(); 

로그인 후 복사

작동효과
서버측 소켓 프로세스를 시작하고 백그라운드에서 실행 중인지 확인하면 다음과 같은 효과가 나타납니다.

2015811151526030.png (985×174)

클라이언트 접속은 브라우저나 컬을 통해 접속할 수 있습니다. 여기서는 컬을 이용해 직접 접속합니다.

2015811151634550.png (930×64)

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿