실제 개발에서 소켓 기반 애플리케이션을 만들려면 소켓 동작 방법을 자세히 이해해야 합니다. 이러한 동작 방법을 능숙하게 이해하고 사용하려면 먼저 다양한 소켓 기능을 이해해야 합니다. PHP에서. 이전 장에서 PHP에서 소켓이란 무엇입니까에 대해 자세히 소개했습니다. 다음은 PHP의 소켓 기능에 대한 소개입니다. PHP에는 수십 가지의 소켓 함수가 있습니다. 다음은 소개할 주요 소켓 함수입니다.
구문 형식 매개 변수는 다음과 같습니다.
1. socket_create
socket_create ( int $domain , int $type , int $protocol )
이 함수는 다음과 같이 사용됩니다. 소켓을 생성하면 세 개의 매개변수가 있고 반환 값은 핸들(리소스)입니다.
$domain은 소켓을 생성할 때 사용되는 통신 프로토콜 제품군을 지정합니다. 선택적 값은 다음과 같습니다.
AF_INET: IPv4 기반 인터넷 프로토콜
AF_INET6: IPv6용 인터넷 프로토콜 기반
AF_UNIX: UNIX 로컬 통신 프로토콜
$type은 소켓 통신의 상호 작용 유형을 지정합니다. 선택 값은 다음과 같습니다.
SOCK_STREAM: 직렬화되고 안정적인 전이중 연결 기반 바이트 스트림 전송 제공, TCP 지원
SOCK_DGRAM: 데이터그램 스타일, 비연결, 고정된 최대 길이, 자동 주소 지정 기능 제공 전송, UDP 지원
SOCK_SEQPACKET: 직렬화되고 안정적인 이중 채널 연결 기반 데이터그램 전송 제공
SOCK_RAW: 원본 네트워크 액세스 프로토콜 제공, 특수 프로토콜을 수동으로 구축 가능 소켓 유형, ICMP 요청(예: ping) 지원
SOCK_RDM: 안정적인 데이터그램 전송을 제공하지만 순서는 보장할 수 없습니다.
$protocol은 ICMP, UDP, TCP를 포함하여 소켓이 사용하는 특정 전송 프로토콜을 지정하며 상수 SOL_UDP는 UDP에 해당합니다. 상수 SOL_TCP는 상수 TCP에 해당합니다.
2. socket_bind
socket_bind ( resource $socket , string $address [, int $port = 0 ] )
이 함수는 소켓_create에 의해 생성된 핸들에 IP 주소와 포트를 바인딩하는 데 사용됩니다. 이 함수에는 세 개의 매개변수가 있으며 부울 값을 반환합니다.
$socket은 필수 매개변수로, 소켓_create 함수에 의해 생성된 핸들을 나타냅니다.
$address는 바인딩할 IP 주소를 나타내는 필수 매개변수입니다.
$port는 바인딩할 포트 번호를 나타내고 소켓 연결을 수신하는 데 사용되는 포트를 지정하는 선택적 매개변수입니다.
3. socket_listen
socket_listen ( resource $socket [, int $backlog = 0 ] )
이 함수는 다가오는 소켓 연결을 수신하는 데 사용됩니다. 소켓의 상호 작용 유형이 SOCK_STREAM 또는 SOCK_SEQPACKET인 경우에만 사용할 수 있습니다.
사용하면 두 개의 매개변수가 있고 부울 값을 반환합니다.
$socket은 소켓_create 함수에 의해 생성되고 호스트에 바인딩된 핸들을 나타내는 필수 매개변수입니다.
$backlog는 처리 대기 중인 항목을 나타내는 선택적 매개변수입니다. 대기열(백로그가 허용됨)의 최대 연결 수입니다.
4. socket_set_block
socket_set_block ( resource $socket )
이 함수는 소켓 핸들을 차단 모드로 설정하는 데 사용되며 필수 매개변수는 하나만 있고 부울 값을 반환합니다. 비차단 모드 소켓을 차단 모드로 변환할 수 있습니다.
차단 모드 소켓에서 작업(수신, 보내기, 연결, 승인 등)을 수행할 때 스크립트는 신호를 받거나 작업을 완료할 때까지 실행을 일시 중지합니다.
$socket은 유효한 소켓 핸들(socket_create 또는 소켓_accept에 의해 생성됨)을 나타내는 필수 매개변수입니다.
차단 모드와 비차단 모드의 차이점을 설명하세요.
비차단이란 함수 작업이 다음 단계까지 실행되지 않음을 의미합니다. 결과를 즉시 얻을 수 없습니다. 현재 스레드를 차단하고 즉시 반환합니다. 차단이란 작업을 완료할 때까지 다시 돌아올 수 없다는 의미입니다. 다음 단계를 계속하려면 먼저 상대방으로부터 응답을 받아야 합니다. 특히, 사용자가 많을 경우에는 반드시 Non-Blocking으로 설정해 주셔야 합니다. 차단 모드인 경우 두 클라이언트가 동시에 연결된 경우 서버가 한 클라이언트의 요청을 처리하는 동안 다른 클라이언트의 요청은 차단됩니다. 이전 클라이언트의 업무가 처리된 후에야 후자 클라이언트의 요청이 처리됩니다. 응답될 것입니다.
5. socket_write
socket_write ( resource $socket , string $buffer [, int $length = 0 ] )
이 함수는 지정된 크기의 버퍼 데이터를 소켓에 쓰는 데 사용되며 세 개의 매개 변수를 가지며 바이트 수를 반환합니다. 작성된 데이터.
$socket은 필수 매개변수이며 유효한 소켓 핸들을 나타냅니다.
$buffer는 작성할 문자열 데이터를 지정하는 필수 매개변수입니다.
$length는 소켓에 차례로 쓸 데이터의 바이트 수를 지정하는 선택적 매개 변수입니다. 해당 값이 $buffer의 바이트 수보다 크면 자동으로 가로채게 됩니다. $buffer의 길이(바이트)입니다.
6. socket_read
socket_read ( resource $socket , int $length [, int $type = PHP_BINARY_READ ] )
이 함수는 소켓에서 지정된 바이트 길이의 데이터를 읽는 데 사용되며, 읽은 문자열 데이터를 반환합니다.
$socket은 필수 매개변수이며 유효한 소켓 핸들을 나타냅니다.
$length는 읽을 바이트 길이를 지정하는 필수 매개변수입니다.
$type은 선택적 매개변수이며, 기본값은 PHP_BINARY_READ입니다. 이는 바이너리 데이터를 안전하게 읽는다는 의미입니다. 다른 선택적 값은 PHP_NORMAL_READ입니다. 이는 r 또는 n이 발견되면 읽기를 중지한다는 의미입니다.
7. pfsockopen
pfsockopen ( string $hostname [, int $port = -1 [, int &$errno [, string &$errstr [, float $timeout = ini_get("default_socket_timeout") ]]]] )
该函数用于实现一个持久的socket连接,即长连接,返回一个句柄。它与 fsockopen 的区别在于,pfsockopen 建立的连接,在脚本执行完毕后,并不会断开。
8. socket_set_option
socket_set_option ( resource$socket , int$level , int$optname , mixed$optval )
该函数用于设置socket的控制选项,有四个参数,返回布尔值。
$socket 是必选参数,代表一个有效的socket句柄。
$level 是必选参数,指定option起作用的协议级别,一般取常量 SOL_SOCKET。
$optname 是必选参数,指定要控制的选项名称。
$optval 是必选参数,指定选项的值。
9. socket_last_error
socket_last_error ([ resource$socket ] )
该函数用于获取任何socket函数产生的最后错误代号,返回值为整型。
10. socket_strerror
socket_strerror ( int $errno )
该函数用于获取错误代号代表的错误描述,返回值为字符串。
以上所有的函数都是PHP中关于socket的,使用这些函数,你必须把你的socket打开,如果你没有打开,请编辑你的php.ini文件,去掉下面这行前面的注释:
extension=php_sockets.dll
如果你不知道你的socket是否打开,那么你可以使用phpinfo()函数来确定socket是否打开。
下面通过创建一个服务端和客户端的例子来说明这些函数的用法:
服务器端
<?php //确保在连接客户端时不会超时 set_time_limit(0); $ip = '127.0.0.1'; $port = 1935; /* +------------------------------- * @socket通信整个过程 +------------------------------- * @socket_create * @socket_bind * @socket_listen * @socket_accept * @socket_read * @socket_write * @socket_close +-------------------------------- */ /*---------------- 以下操作都是手册上的 -------------------*/ if(($sock = socket_create(AF_INET,SOCK_STREAM,SOL_TCP)) < 0) { echo "socket_create() 失败的原因是:".socket_strerror($sock)."\n"; } if(($ret = socket_bind($sock,$ip,$port)) < 0) { echo "socket_bind() 失败的原因是:".socket_strerror($ret)."\n"; } if(($ret = socket_listen($sock,4)) < 0) { echo "socket_listen() 失败的原因是:".socket_strerror($ret)."\n"; } $count = 0; do { if (($msgsock = socket_accept($sock)) < 0) { echo "socket_accept() failed: reason: " . socket_strerror($msgsock) . "\n"; break; } else { //发到客户端 $msg ="测试成功!\n"; socket_write($msgsock, $msg, strlen($msg)); echo "测试成功了啊\n"; $buf = socket_read($msgsock,8192); $talkback = "收到的信息:$buf\n"; echo $talkback; if(++$count >= 5){ break; }; } //echo $buf; socket_close($msgsock); } while (true); socket_close($sock); ?>
2. 客户端
<?php error_reporting(E_ALL); set_time_limit(0); echo "<h2>TCP/IP Connection</h2>\n"; $port = 1935; $ip = "127.0.0.1"; /* +------------------------------- * @socket连接整个过程 +------------------------------- * @socket_create * @socket_connect * @socket_write * @socket_read * @socket_close +-------------------------------- */ $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); if ($socket < 0) { echo "socket_create() failed: reason: " . socket_strerror($socket) . "\n"; }else { echo "OK.\n"; } echo "试图连接 '$ip' 端口 '$port'...\n"; $result = socket_connect($socket, $ip, $port); if ($result < 0) { echo "socket_connect() failed.\nReason: ($result) " . socket_strerror($result) . "\n"; }else { echo "连接OK\n"; } $in = "Ho\r\n"; $in .= "first blood\r\n"; $out = ''; if(!socket_write($socket, $in, strlen($in))) { echo "socket_write() failed: reason: " . socket_strerror($socket) . "\n"; }else { echo "发送到服务器信息成功!\n"; echo "发送的内容为:<font color='red'>$in</font> <br>"; } while($out = socket_read($socket, 8192)) { echo "接收服务器回传信息成功!\n"; echo "接受的内容为:",$out; } echo "关闭SOCKET...\n"; socket_close($socket); echo "关闭OK\n"; ?>
【相关教程推荐】
위 내용은 PHP의 기본 소켓 함수 구문 및 사용 예에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!