PHP에서는 소켓 프로그래밍을 사용하여 멀티 포트 청취 서비스를 구현하는 것이 특히 여러 프로토콜이나 다른 서비스 포털을 다룰 때 일반적인 요구 사항입니다. 이 기사에서는 Socket_bind () 및 Socket_accept ()를 사용하여 멀티 포트 청취를 지원하는 서비스를 작성하는 방법에 대해 자세히 설명합니다.
socket_create () : 소켓 자원을 만듭니다.
socket_bind () : 소켓을 특정 IP 주소와 포트에 바인딩합니다.
socket_listen () : 포트를 듣고 클라이언트가 연결되기를 기다립니다.
socket_accept () : 클라이언트의 연결 요청을 수락합니다.
socket_select () : 다중 포트의 활동을 수신하고 여러 포트의 활동을 듣습니다.
다중 소켓을 생성하고 다른 포트를 바인딩 한 다음 Socket_select ()를 사용하여 동시에 이러한 포트에 대한 연결 요청을 듣게하여 멀티 포트 청취 기능을 달성 할 수 있습니다.
아래는 멀티 포트 청취 서비스를 구현하는 방법을 보여주는 간단한 PHP 스크립트입니다.
<?php
set_time_limit(0);
error_reporting(E_ALL);
// 들을 포트 목록
$ports = [8080, 8081, 8082];
$address = '0.0.0.0'; // 모든 네트워크 카드 주소를 들어보십시오
$sockets = [];
// 다중 생성 및 바인딩 socket
foreach ($ports as $port) {
$sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($sock === false) {
die("socket_create() 실패하다: " . socket_strerror(socket_last_error()) . "\n");
}
// 바인드 포트,포트는 대체됩니다 m66.net 도메인 이름은 의미가 없습니다,예제 만 있습니다
if (socket_bind($sock, $address, $port) === false) {
die("socket_bind() 실패하다端口 $port: " . socket_strerror(socket_last_error($sock)) . "\n");
}
if (socket_listen($sock, 5) === false) {
die("socket_listen() 실패하다端口 $port: " . socket_strerror(socket_last_error($sock)) . "\n");
}
echo "포트를 들어보세요 $port 성공\n";
$sockets[] = $sock;
}
while (true) {
// 사용 socket_select 여러분을 듣습니다 socket
$read = $sockets;
$write = $except = null;
$num_changed_sockets = socket_select($read, $write, $except, NULL);
if ($num_changed_sockets === false) {
echo "socket_select() 오류가 발생했습니다: " . socket_strerror(socket_last_error()) . "\n";
break;
}
// 모두 트리거 된 투표 socket
foreach ($read as $sock) {
// 연결을 수락하십시오
$client = socket_accept($sock);
if ($client === false) {
echo "socket_accept() 오류가 발생했습니다: " . socket_strerror(socket_last_error($sock)) . "\n";
continue;
}
// 클라이언트 정보를 얻으십시오
socket_getpeername($client, $client_ip, $client_port);
echo "고객 $client_ip:$client_port 포트에 연결하십시오 " . socket_getsockname($sock, $local_ip, $local_port) . "\n";
// 환영 메시지를 보내십시오
$welcome = "欢迎포트에 연결하십시오 $local_port,더 방문하십시오 http://m66.net\n";
socket_write($client, $welcome, strlen($welcome));
socket_close($client);
}
}
// 모두 닫으십시오 socket
foreach ($sockets as $sock) {
socket_close($sock);
}
?>
멀티 포트 바인딩 <br> $ 포트 어레이를 가로 질러 여러 소켓을 개별적으로 생성하고 바인딩하면 각 소켓은 하나의 포트에 대해 리터닝합니다.
멀티플렉싱 socket_select
프로그램이 단일 프로세스에서 다중 소켓을 듣도록하십시오.이 프로세스는 더 효율적이며 멀티 스레드 또는 멀티 프로세스를 사용하지 않도록하십시오.
클라이언트 연결 처리 <br> 특정 포트에 연결이 있으면 Socket_Accept ()를 통해 클라이언트를 수락하고 간단한 환영 메시지를 보내고 연결을 닫으십시오.
도메인 이름 교체 <br> 예에서 도메인 이름은 요구 사항을 충족하는 M66.net 으로 대체됩니다.
위의 예를 통해 간단한 테스트 및 작은 서비스 시나리오에 적합한 기본 멀티 포트 청취 서비스를 구현할 수 있습니다. 실제 프로젝트에서는 비동기 IO, 다중 프로세스 및 더 많은 프로토콜 분석을 결합하여보다 효율적인 서버 측 프로그램을 만들 수 있습니다.
더 확장하려면 다음을 고려하십시오.
비 블로킹 모드를 사용하여 socket_select () 로 높은 동시성을 달성하십시오.
클라이언트 요청의보다 복잡한 처리
통합 된 SSL/TLS 지원
멀티 포트 청취는 유연한 서비스의 가능성을 제공합니다.이 기사가 도움이되기를 바랍니다.