> php教程 > PHP开发 > 본문

PHP 소켓 기본 사항

黄舟
풀어 주다: 2016-12-17 10:30:42
원래의
1214명이 탐색했습니다.

◆ 소켓 기본
php는 Berkley의 소켓 라이브러리를 사용하여 연결을 생성합니다. 소켓은 데이터 구조에 지나지 않습니다. 이 소켓 데이터 구조를 사용하여 클라이언트와 서버 간의 세션을 시작합니다. 이 서버는 항상 새 세션 생성을 듣고 준비하고 있습니다. 클라이언트가 서버에 연결되면 서버가 세션을 수신하는 포트를 엽니다. 이때 서버는 클라이언트의 연결 요청을 수락한 후 한 사이클을 수행하게 됩니다. 이제 클라이언트는 서버에 정보를 보낼 수 있고, 서버는 클라이언트에 정보를 보낼 수 있습니다.
소켓을 생성하려면 프로토콜, 소켓 유형, 공용 프로토콜 유형이라는 세 가지 변수가 필요합니다. 소켓을 생성할 때 선택할 수 있는 세 가지 프로토콜이 있습니다. 자세한 프로토콜 내용을 보려면 아래를 계속 읽으세요.
공용 프로토콜 유형을 정의하는 것은 연결을 위한 필수 요소입니다. 아래 표에서는 일반적인 프로토콜 유형을 살펴봅니다.
표 1: 프로토콜
이름/상수 설명
AF_INET 이것은 TCP 또는 UDP를 사용하여 전송을 위해 소켓을 생성하는 데 사용되는 대부분의 프로토콜이며 ipv4 주소에서 사용됩니다.
AF_INET6 위와 유사합니다. 그러나 IPv6 주소에 사용됩니다.
Unix 및 Linux 시스템에서 사용되는 AF_UNIX 로컬 프로토콜은 일반적으로 클라이언트와 서버가 동일한 시스템에 있을 때 사용됩니다.
표 2: 소켓 유형
이름/상수 설명
SOCK_STREAM 이 프로토콜은 순차적이고 신뢰할 수 있는 데이터 완전한 바이트 스트림 기반 연결입니다. 가장 일반적으로 사용되는 소켓 유형입니다. 이 소켓은 전송에 TCP를 사용합니다.
SOCK_DGRAM 이 프로토콜은 연결이 없는 고정 길이 전송 호출입니다. 이 프로토콜은 신뢰할 수 없으며 연결에 UDP를 사용합니다.
SOCK_SEQPACKET 이 프로토콜은 전송을 위해 고정 길이 데이터 패킷을 보내는 안정적인 이중 회선 연결입니다. 이 패킷을 읽으려면 먼저 완전히 수락해야 합니다.
SOCK_RAW 이 소켓 유형은 단일 네트워크 액세스를 제공하며 ICMP 공용 프로토콜을 사용합니다. (ping 및 Traceroute는 이 프로토콜을 사용합니다.)
SOCK_RDM 이 유형은 거의 사용되지 않으며 대부분의 운영 체제에서 구현되지 않습니다. 이는 데이터 링크 계층에 제공되며 데이터 패킷의 순서를 보장하지 않습니다.
표 3: 공개 프로토콜
이름/상수 설명
ICMP 인터넷 제어 메시지 프로토콜, 주로 게이트웨이와 호스트에서 네트워크 상태를 확인하고 오류 메시지를 보고하는 데 사용됩니다.
UDP 사용자 데이터 메시지 프로토콜, 무선 연결이며 신뢰할 수 없는 전송 프로토콜입니다. 🎜>TCP 전송 제어 프로토콜은 가장 일반적으로 사용되는 신뢰할 수 있는 공용 프로토콜로, 데이터 패킷이 수신자에게 도달할 수 있도록 보장합니다. 전송 중에 오류가 발생하면 오류 패킷이 다시 전송됩니다.
이제 소켓을 생성하는 세 가지 요소를 알았으므로 PHP에서 소켓_create() 함수를 사용하여 소켓을 생성합니다. 이 소켓_create() 함수에는 프로토콜, 소켓 유형 및 공용 프로토콜의 세 가지 매개변수가 필요합니다. 소켓_create() 함수는 성공하면 소켓이 포함된 리소스 유형을 반환하고, 실패하면 false를 반환합니다.
Resourcesocket_create(int PROtocol, int socketType, int commonProtocol);
이제 소켓을 생성한 다음에는 무엇을 할까요? PHP는 소켓을 조작하기 위한 여러 함수를 제공합니다. 소켓을 IP에 바인딩하고, 소켓의 통신을 수신하고, 소켓을 수락할 수 있습니다. 이제 함수가 소켓을 생성하고 수락하고 수신하는 방법을 이해하기 위해 예제를 살펴보겠습니다.
$commonProtocol = getprotobyname("tcp");//공용 프로토콜 이름을 사용하여 프로토콜 유형 가져오기
$socket = 소켓_create(AF_INET, SOCK_STREAM, $commonProtocol);// 소켓을 생성하고 소켓 리소스의 인스턴스를 반환합니다
socket_bind($socket, 'localhost', 1337);//소켓을 로컬 컴퓨터에 바인딩
socket_listen($socket);//수신되는 모든 내용을 수신합니다. 소켓 연결
// 더 많은 소켓 기능 제공
?>
위의 예는 자체 서버 측을 생성합니다. 예제의 첫 번째 줄은
$commonProtocol = getprotobyname("tcp");
공용 프로토콜 이름을 사용하여 프로토콜 유형을 가져옵니다. 여기서는 TCP 공용 프로토콜이 사용됩니다. UDP 또는 ICMP 프로토콜을 사용하려면 getprotobyname() 함수의 매개변수를 "udp" 또는 "icmp"로 변경해야 합니다. 또 다른 대안은 getprotobyname() 함수를 사용하는 대신 소켓_create() 함수에 SOL_TCP 또는 SOL_UDP를 지정하는 것입니다.
$socket = 소켓_create(AF_INET, SOCK_STREAM, SOL_TCP);
예제의 두 번째 줄은 소켓을 생성하고 소켓 리소스의 인스턴스를 반환합니다. 소켓 리소스의 인스턴스가 있으면 소켓을 IP 주소 및 포트에 바인딩해야 합니다.
socket_bind($socket, 'localhost', 1337);
여기서 소켓을 로컬 컴퓨터(127.0.0.1)에 바인딩하고 소켓을 1337 포트에 바인딩합니다. 그런 다음 들어오는 모든 소켓 연결을 수신해야 합니다.
socket_listen($socket);
네 번째 줄 이후에는 모든 소켓 기능과 사용법을 이해해야 합니다.
표 4: 소켓 함수
함수 이름 설명
소켓_accept() 소켓 연결 수락
socket_bind() 소켓을 IP 주소 및 포트에 바인딩
socket_clear_error() 소켓 오류 또는 마지막 오류 코드 지우기
socket_close() 소켓 리소스 닫기
socket_connect () 소켓 연결 시작
socket_create_listen() 지정된 포트에서 수신하기 위해 소켓 열기
socket_create_pair() 구별할 수 없는 소켓 쌍을 배열로 생성
socket_create() 소켓 생성, 꽤 소켓 생성 데이터 구조
socket_get_option() 소켓 옵션 가져오기
socket_getpeername() 유사한 원격 호스트의 IP 주소 가져오기
socket_getsockname() 로컬 소켓의 IP 주소 가져오기
socket_iovec_add() 새 추가 벡터를 분산/집계 배열로 변환
socket_iovec_alloc() 이 함수는 전송, 수신, 읽기 및 쓰기가 가능한 iovec 데이터 구조를 생성합니다
socket_iovec_delete() 할당된 iovec을 삭제합니다
socket_iovec_fetch() 지정된 iovec 리소스를 반환합니다. data
socket_iovec_free() iovec 리소스 해제
socket_iovec_set() iovec 데이터의 새 값 설정
socket_last_error() 현재 소켓의 마지막 오류 코드 가져오기
socket_listen() 다음의 모든 메시지 듣기 지정된 소켓 Connect
socket_read() 지정된 길이의 데이터 읽기
socket_readv() 분산/집합 배열에서 데이터 읽기
socket_recv() 소켓에서 캐시로 데이터 종료
socket_recvfrom() 데이터 수락 지정된 소켓, 지정하지 않으면 현재 소켓이 기본값이 됩니다
socket_recvmsg() iovec에서 메시지 수신
socket_select() 다중 선택
socket_send() 이 함수는 연결된 소켓으로 데이터를 보냅니다
socket_sendmsg( ) 소켓에 메시지 보내기
socket_sendto() 지정된 주소의 소켓에 메시지 보내기
socket_set_block() 소켓을 차단 모드로 설정
socket_set_nonblock() 소켓을 비차단 모드로 설정
socket_set_option () 소켓 옵션 설정
socket_shutdown() 이 함수를 사용하면 읽기, 쓰기 또는 지정된 소켓을 닫을 수 있습니다.
socket_strerror() 지정된 오류 번호로 자세한 오류를 반환합니다.
socket_write() 데이터 쓰기 소켓 캐시에
socket_writev() 분산/집계 배열에 데이터 쓰기
위의 모든 함수는 PHP의 소켓에 관한 것입니다. 이 함수를 사용하려면 소켓을 열어야 합니다. php.ini 파일에서 다음 행 앞의 주석을 제거하십시오:
extension=php_sockets.dll
주석을 제거할 수 없는 경우 다음 코드를 사용하여 확장 라이브러리를 로드하십시오:
< ;?php
if( !extension_loaded('sockets')) {
if(strtoupper(substr(PHP_OS, 3)) == "WIN") {
dl('php_sockets.dll');
}else{
dl('sockets.so');
}
}
?>
소켓이 열려 있는지 모르는 경우 다음을 수행할 수 있습니다. phpinfo() 함수를 사용하여 소켓이 열려 있는지 확인합니다. phpinfo 정보를 확인하면 소켓이 열려 있는지 확인할 수 있습니다.
phpinfo()의 소켓 정보 보기
◆ 서버 생성
이제 첫 번째 예제를 개선하겠습니다. 특정 소켓을 수신하고 사용자 연결을 처리해야 합니다.
$commonProtocol = getprotobyname("tcp");
$socket = 소켓_create(AF_INET, SOCK_STREAM, $commonProtocol);
socket_bind($socket, 'localhost', 1337) ;
socket_listen($socket);
// 서버로 들어오는 모든 연결 수락
$connection = 소켓_accept($socket);
if($connection){
socket_write($connection , "소켓에 연결되었습니다...nr");
}
?>
이 예제를 실행하려면 명령 프롬프트를 사용해야 합니다. 그 이유는 여기에 웹페이지가 아닌 서버가 생성되기 때문이다. 웹 브라우저를 사용하여 이 스크립트를 실행하려고 하면 30초 제한을 초과할 가능성이 높습니다. 아래 코드를 사용하여 무한 실행 시간을 설정할 수 있지만, 실행하려면 명령 프롬프트를 사용하는 것이 좋습니다.
set_time_limit(0);
명령 프롬프트에서 이 스크립트에 대한 간단한 테스트:
Php.exe example01_server.php
시스템의 환경 변수 경로에 PHP 인터프리터를 설정하지 않은 경우 php.exe에 대한 자세한 경로를 지정해야 합니다. 서버를 실행하면 텔넷을 통해 1337번 포트에 접속하여 서버를 테스트할 수 있습니다.

위의 서버 측에는 세 가지 문제가 있습니다. 1. 다중 연결을 허용할 수 없습니다. 2. 하나의 명령만 완료합니다. 3. 웹 브라우저를 통해 이 서버에 연결할 수 없습니다.
이 첫 번째 문제는 해결하기가 더 쉽습니다. 애플리케이션을 사용하여 매번 서버에 연결할 수 있습니다. 하지만 다음 문제는 서버에 연결하기 위해 웹 페이지를 사용해야 한다는 점인데, 이는 더 어렵습니다. 서버가 연결을 수락하고 클라이언트에 일부 데이터를 쓰고(필요한 경우) 연결을 닫고 다음 연결을 기다리도록 할 수 있습니다.
이전 코드를 개선하고 다음 코드를 생성하여 새 서버를 만듭니다.
// 소켓 설정
$commonProtocol = getprotobyname(" tcp");
$socket = 소켓_create(AF_INET, SOCK_STREAM, $commonProtocol);
socket_bind($socket, 'localhost', 1337) //socket_bind() 소켓을 IP 주소 및 포트에 바인딩
socket_listen($ 소켓);
// 버퍼 초기화
$buffer = "NO DATA";
while(true) {
// 이 소켓으로 들어오는 모든 연결 허용
$connection = 소켓_accept ($socket);//socket_accept() 소켓 연결 수락
printf("Socketconnectedrn");
// 버퍼에 아무것도 없는지 확인
if($buffer != " "){
printf("버퍼에 뭔가가 있습니다...데이터를 보내는 중...rn");
socket_write($connection, $buffer . "rn"); / /socket_write() 데이터 쓰기 소켓 캐시
printf("소켓에 기록됨");
}else {
printf("버퍼에 데이터 없음");
}
// 입력 가져오기
while($data = 소켓_read($connection, 1024, PHP_NORMAL_READ))//socket_read() 지정된 길이의 데이터 읽기
{
$buffer = $data;
socket_write( $connection, "Information receivedrn" );
printf("Buffer: " . $buffer . "rn");
}
socket_close($connection); //socket_close() 소켓 리소스 닫기
printf("Closed the 소켓rnrn");
}
?>
이 서버는 무엇을 해야 합니까? 소켓을 초기화하고 캐시를 열어 데이터를 보내고 받습니다. 연결을 기다리고 연결이 이루어지면 서버 측 화면에 "소켓 연결됨"을 인쇄합니다. 이 서버는 버퍼를 확인하여 버퍼에 데이터가 있으면 연결된 컴퓨터로 데이터를 보냅니다. 그런 다음 이 데이터에 대한 수락 메시지를 보냅니다. 메시지를 수락하면 메시지를 데이터에 저장하고 연결된 컴퓨터가 메시지를 인식하게 한 다음 마지막으로 연결을 닫습니다. 연결이 닫히면 서버는 다음 연결 처리를 시작합니다.
◆ 두 번째 문제를 처리할 클라이언트
를 제작하는 것은 쉽습니다. PHP 페이지를 생성하고, 소켓에 연결하고, 일부 데이터를 캐시로 보내고 처리해야 합니다. 그런 다음 처리된 데이터가 대기 중이고 데이터를 서버로 보낼 수 있습니다. 다른 클라이언트 연결에서는 해당 데이터를 처리합니다.
다음 예에서는 소켓 사용을 보여줍니다.
// 소켓 생성 및 연결
$socket = 소켓_create(AF_INET, SOCK_STREAM, SOL_TCP);
$connection = 소켓_연결($socket,'localhost', 1337);
while($buffer = 소켓_read($socket, 1024, PHP_NORMAL_READ)) {
if($buffer == “NO DATA”) {
echo ( "

NO DATA

");
break;
}else{
// 버퍼에 있는 데이터로 작업 수행
echo("

Buffer 데이터 : " . $buffer . "

");
}
}
echo("

소켓에 쓰기

");
// 쓰기 소켓에 일부 테스트 데이터
if(!socket_write($socket, “SOME DATArn”)){
echo(“

쓰기 실패

”);
}
/ / 소켓에서 응답 읽기
while($buffer = 소켓_read($socket, 1024, PHP_NORMAL_READ)){
echo("

전송된 데이터: SOME DATA
응답:" . $buffer . “

”);
}
echo(“

소켓 읽기 완료

”);
?>
이 코드 example 서버에 대한 클라이언트 연결을 보여줍니다. 클라이언트가 데이터를 읽습니다. 이것이 이 주기에 도착하는 첫 번째 연결인 경우 서버는 클라이언트에 "NO DATA"를 다시 보냅니다. 이런 일이 발생하면 클라이언트가 연결의 최상위에 있습니다. 클라이언트는 데이터를 서버로 보내고, 데이터는 서버로 전송되며, 클라이언트는 응답을 기다립니다. 응답을 받으면 화면에 응답을 씁니다.


위 내용은 php Socket의 기본 내용입니다. 더 많은 관련 글은 PHP 중국어 홈페이지(www.php.cn)를 참고해주세요!


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