먼저, socket_wsaprotocol_info_import 의 기본 함수를 이해하십시오. 이 기능은 WSA (Windows Socket API) 프로토콜 정보를 가져 오기위한 PHP의 도구입니다. 주요 기능은 Windows 소켓 프로토콜의 정보를 PHP 소켓 컨텍스트에로드하여 개발자가 Windows 시스템에서 다양한 유형의 네트워크 프로토콜을 유연하게 사용할 수 있도록하는 것입니다.
<span><span><span class="hljs-keyword">int</span></span><span> </span><span><span class="hljs-title function_ invoke__">socket_wsaprotocol_info_import</span></span><span> ( resource </span><span><span class="hljs-variable">$socket</span></span><span>, </span><span><span class="hljs-keyword">int</span></span><span> </span><span><span class="hljs-variable">$protocol_info</span></span><span> )
</span></span>
$ 소켓 : 생성 된 소켓 리소스.
$ protocol_info : 일반적으로 socket_get_option 및 기타 방법을 통해 얻은 프로토콜 정보 식별자.
이 함수의 반환 값은 작업이 성공했는지 여부를 나타내는 부울 값입니다.
Windows Systems에서 PHP 소켓을 사용하는 경우 Socket_wsaprotocol_info_import를 호출 하여 프로토콜 정보를 가져 오기 위해 소켓을 생성하고 바인딩 해야합니다. 다음은 일반적인 사용 시나리오입니다.
<span><span><span class="hljs-comment">// a UDP 소켓</span></span><span>
</span><span><span class="hljs-variable">$socket</span></span><span> = </span><span><span class="hljs-title function_ invoke__">socket_create</span></span><span>(AF_INET, SOCK_DGRAM, SOL_UDP);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$socket</span></span><span> === </span><span><span class="hljs-literal">false</span></span><span>) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"创建소켓失败: "</span></span><span> . </span><span><span class="hljs-title function_ invoke__">socket_strerror</span></span><span>(</span><span><span class="hljs-title function_ invoke__">socket_last_error</span></span><span>()) . </span><span><span class="hljs-string">"\n"</span></span><span>;
</span><span><span class="hljs-keyword">exit</span></span><span>;
}
</span><span><span class="hljs-comment">// 프로토콜 정보 가져 오기</span></span><span>
</span><span><span class="hljs-variable">$protocol_info</span></span><span> = </span><span><span class="hljs-title function_ invoke__">socket_get_option</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>, SOL_SOCKET, SO_PROTOCOL_INFO);
</span><span><span class="hljs-title function_ invoke__">socket_wsaprotocol_info_import</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>, </span><span><span class="hljs-variable">$protocol_info</span></span><span>);
</span><span><span class="hljs-comment">// 绑定소켓</span></span><span>
</span><span><span class="hljs-variable">$bind_result</span></span><span> = </span><span><span class="hljs-title function_ invoke__">socket_bind</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>, </span><span><span class="hljs-string">'0.0.0.0'</span></span><span>, </span><span><span class="hljs-number">8080</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$bind_result</span></span><span> === </span><span><span class="hljs-literal">false</span></span><span>) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"바인딩이 실패했습니다: "</span></span><span> . </span><span><span class="hljs-title function_ invoke__">socket_strerror</span></span><span>(</span><span><span class="hljs-title function_ invoke__">socket_last_error</span></span><span>()) . </span><span><span class="hljs-string">"\n"</span></span><span>;
</span><span><span class="hljs-keyword">exit</span></span><span>;
}
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"UDP 소켓创建并绑定成功。\n"</span></span><span>;
</span></span>
이 예에서는 먼저 UDP 소켓을 생성 한 다음 Socket_get_option을 통해 프로토콜 정보를 얻은 다음 Socket_wsaprotocol_info_import를 사용하여 소켓으로 프로토콜 정보를 가져옵니다. 마지막으로 소켓을 지정된 IP 주소와 포트에 바인딩합니다.
이 접근법을 사용하면 특히 특정 프로토콜을 사용해야 할 때 Windows 환경에서 소켓의 동작을보다 세분화 할 수 있습니다.
PHP의 Socket_select 함수를 사용하면 차단 작업을 피하고 여러 소켓 중에서 선택할 수 있습니다. 이를 통해 여러 연결 요청을 동시에 처리 할 수 있으며 효율적인 네트워크 응용 프로그램을 구현할 때 매우 유용합니다.
<span><span><span class="hljs-comment">// a TCP 소켓</span></span><span>
</span><span><span class="hljs-variable">$serverSocket</span></span><span> = </span><span><span class="hljs-title function_ invoke__">socket_create</span></span><span>(AF_INET, SOCK_STREAM, SOL_TCP);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$serverSocket</span></span><span> === </span><span><span class="hljs-literal">false</span></span><span>) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"创建소켓失败: "</span></span><span> . </span><span><span class="hljs-title function_ invoke__">socket_strerror</span></span><span>(</span><span><span class="hljs-title function_ invoke__">socket_last_error</span></span><span>()) . </span><span><span class="hljs-string">"\n"</span></span><span>;
</span><span><span class="hljs-keyword">exit</span></span><span>;
}
</span><span><span class="hljs-comment">// 프로토콜 정보 가져 오기</span></span><span>
</span><span><span class="hljs-variable">$protocol_info</span></span><span> = </span><span><span class="hljs-title function_ invoke__">socket_get_option</span></span><span>(</span><span><span class="hljs-variable">$serverSocket</span></span><span>, SOL_SOCKET, SO_PROTOCOL_INFO);
</span><span><span class="hljs-title function_ invoke__">socket_wsaprotocol_info_import</span></span><span>(</span><span><span class="hljs-variable">$serverSocket</span></span><span>, </span><span><span class="hljs-variable">$protocol_info</span></span><span>);
</span><span><span class="hljs-comment">// 묶고 듣습니다</span></span><span>
</span><span><span class="hljs-title function_ invoke__">socket_bind</span></span><span>(</span><span><span class="hljs-variable">$serverSocket</span></span><span>, </span><span><span class="hljs-string">'0.0.0.0'</span></span><span>, </span><span><span class="hljs-number">8081</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">socket_listen</span></span><span>(</span><span><span class="hljs-variable">$serverSocket</span></span><span>);
</span><span><span class="hljs-comment">// 비 블로킹을 설정하십시오</span></span><span>
</span><span><span class="hljs-title function_ invoke__">socket_set_nonblock</span></span><span>(</span><span><span class="hljs-variable">$serverSocket</span></span><span>);
</span><span><span class="hljs-variable">$clients</span></span><span> = [</span><span><span class="hljs-variable">$serverSocket</span></span><span>];
</span><span><span class="hljs-keyword">while</span></span><span> (</span><span><span class="hljs-literal">true</span></span><span>) {
</span><span><span class="hljs-variable">$read</span></span><span> = </span><span><span class="hljs-variable">$clients</span></span><span>;
</span><span><span class="hljs-variable">$write</span></span><span> = </span><span><span class="hljs-literal">null</span></span><span>;
</span><span><span class="hljs-variable">$except</span></span><span> = </span><span><span class="hljs-literal">null</span></span><span>;
</span><span><span class="hljs-comment">// 사용 socket_select 비 차단 대기</span></span><span>
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">socket_select</span></span><span>(</span><span><span class="hljs-variable">$read</span></span><span>, </span><span><span class="hljs-variable">$write</span></span><span>, </span><span><span class="hljs-variable">$except</span></span><span>, </span><span><span class="hljs-number">0</span></span><span>, </span><span><span class="hljs-number">10</span></span><span>) > </span><span><span class="hljs-number">0</span></span><span>) {
</span><span><span class="hljs-keyword">foreach</span></span><span> (</span><span><span class="hljs-variable">$read</span></span><span> </span><span><span class="hljs-keyword">as</span></span><span> </span><span><span class="hljs-variable">$socket</span></span><span>) {
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$socket</span></span><span> == </span><span><span class="hljs-variable">$serverSocket</span></span><span>) {
</span><span><span class="hljs-comment">// 새로운 연결을 수락하십시오</span></span><span>
</span><span><span class="hljs-variable">$clientSocket</span></span><span> = </span><span><span class="hljs-title function_ invoke__">socket_accept</span></span><span>(</span><span><span class="hljs-variable">$serverSocket</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">socket_set_nonblock</span></span><span>(</span><span><span class="hljs-variable">$clientSocket</span></span><span>);
</span><span><span class="hljs-variable">$clients</span></span><span>[] = </span><span><span class="hljs-variable">$clientSocket</span></span><span>;
} </span><span><span class="hljs-keyword">else</span></span><span> {
</span><span><span class="hljs-comment">// 클라이언트 데이터를 읽습니다</span></span><span>
</span><span><span class="hljs-variable">$data</span></span><span> = </span><span><span class="hljs-title function_ invoke__">socket_read</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>, </span><span><span class="hljs-number">1024</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$data</span></span><span> === </span><span><span class="hljs-literal">false</span></span><span> || </span><span><span class="hljs-variable">$data</span></span><span> === </span><span><span class="hljs-string">""</span></span><span>) {
</span><span><span class="hljs-title function_ invoke__">socket_close</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>);
</span><span><span class="hljs-keyword">unset</span></span><span>(</span><span><span class="hljs-variable">$clients</span></span><span>[</span><span><span class="hljs-title function_ invoke__">array_search</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>, </span><span><span class="hljs-variable">$clients</span></span><span>)]);
} </span><span><span class="hljs-keyword">else</span></span><span> {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"클라이언트 데이터를 받았습니다: "</span></span><span> . </span><span><span class="hljs-variable">$data</span></span><span> . </span><span><span class="hljs-string">"\n"</span></span><span>;
</span><span><span class="hljs-title function_ invoke__">socket_write</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>, </span><span><span class="hljs-string">"받다: "</span></span><span> . </span><span><span class="hljs-variable">$data</span></span><span>);
}
}
}
}
}
</span></span>
이 예에서 서버는 TCP 소켓을 생성하고 소시 _select를 사용하여 비 블로킹 I/O 작업을 구현하여 비 블로킹 모드로 설정합니다. socket_wsaprotocol_info_import 와 결합하여 특정 프로토콜을 유연하게 사용하여 소켓 동작을 최적화 할 수 있습니다.
socket_recv 및 socket_send 함수를 통해 효율적인 네트워크 데이터 전송을 수행 할 수 있습니다. socket_wsaprotocol_info_import 와 함께 사용하면 프로토콜 요구 사항에 따라 소켓 동작을 조정하여 데이터 전송이 더 안정적인지 확인할 수 있습니다.
<span><span><span class="hljs-variable">$socket</span></span><span> = </span><span><span class="hljs-title function_ invoke__">socket_create</span></span><span>(AF_INET, SOCK_STREAM, SOL_TCP);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$socket</span></span><span> === </span><span><span class="hljs-literal">false</span></span><span>) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"创建소켓失败: "</span></span><span> . </span><span><span class="hljs-title function_ invoke__">socket_strerror</span></span><span>(</span><span><span class="hljs-title function_ invoke__">socket_last_error</span></span><span>()) . </span><span><span class="hljs-string">"\n"</span></span><span>;
</span><span><span class="hljs-keyword">exit</span></span><span>;
}
</span><span><span class="hljs-comment">// 프로토콜 정보 가져 오기</span></span><span>
</span><span><span class="hljs-variable">$protocol_info</span></span><span> = </span><span><span class="hljs-title function_ invoke__">socket_get_option</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>, SOL_SOCKET, SO_PROTOCOL_INFO);
</span><span><span class="hljs-title function_ invoke__">socket_wsaprotocol_info_import</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>, </span><span><span class="hljs-variable">$protocol_info</span></span><span>);
</span><span><span class="hljs-comment">// 서버에 연결하십시오</span></span><span>
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">socket_connect</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>, </span><span><span class="hljs-string">'127.0.0.1'</span></span><span>, </span><span><span class="hljs-number">8080</span></span><span>) === </span><span><span class="hljs-literal">false</span></span><span>) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"연결이 실패했습니다: "</span></span><span> . </span><span><span class="hljs-title function_ invoke__">socket_strerror</span></span><span>(</span><span><span class="hljs-title function_ invoke__">socket_last_error</span></span><span>()) . </span><span><span class="hljs-string">"\n"</span></span><span>;
</span><span><span class="hljs-keyword">exit</span></span><span>;
}
</span><span><span class="hljs-comment">// 데이터를 보냅니다</span></span><span>
</span><span><span class="hljs-variable">$message</span></span><span> = </span><span><span class="hljs-string">"Hello, Server!"</span></span><span>;
</span><span><span class="hljs-title function_ invoke__">socket_send</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>, </span><span><span class="hljs-variable">$message</span></span><span>, </span><span><span class="hljs-title function_ invoke__">strlen</span></span><span>(</span><span><span class="hljs-variable">$message</span></span><span>), </span><span><span class="hljs-number">0</span></span><span>);
</span><span><span class="hljs-comment">// 데이터를 수신합니다</span></span><span>
</span><span><span class="hljs-variable">$buffer</span></span><span> = </span><span><span class="hljs-string">''</span></span><span>;
</span><span><span class="hljs-title function_ invoke__">socket_recv</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>, </span><span><span class="hljs-variable">$buffer</span></span><span>, </span><span><span class="hljs-number">2048</span></span><span>, </span><span><span class="hljs-number">0</span></span><span>);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"받다数据: "</span></span><span> . </span><span><span class="hljs-variable">$buffer</span></span><span> . </span><span><span class="hljs-string">"\n"</span></span><span>;
</span><span><span class="hljs-title function_ invoke__">socket_close</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>);
</span></span>
이 예에서는 socket_send를 통해 데이터를 보내고 socket_recv를 통해 응답 데이터를 수신합니다. socket_wsaprotocol_info_import 와 함께 소켓 프로토콜 정보는 다른 프로토콜의 요구에 따라 최적화되어 통신 효율성 및 신뢰성을 향상시킬 수 있습니다.