현재 위치: > 최신 기사 목록> FSOCOPEN 기능을 통해 데이터를 전송하여 소켓의 데이터 전송을 구현하는 방법은 무엇입니까? 팁은 무엇입니까?

FSOCOPEN 기능을 통해 데이터를 전송하여 소켓의 데이터 전송을 구현하는 방법은 무엇입니까? 팁은 무엇입니까?

gitbox 2025-06-21

PHP에서 FSOCOPEN 기능은 소켓 연결을 생성하는 데 일반적으로 사용되는 기능으로 원격 서버와 데이터를 통신 할 수 있습니다. FSOCCKOPEN을 사용하면 간단한 소켓 데이터 전송을 구현할 수 있으며, 이는 저수준 네트워크 작업이 필요한 애플리케이션에 매우 유용합니다. 이 기사는 FSOCOPEN을 사용하여 데이터 전송을 구현하고 사용 중에 사용할 수있는 몇 가지 팁을 공유하는 방법을 살펴 봅니다.

1. FSOCCKOPEN 기능의 기본 사용

FSOCCKOPEN 기능은 네트워크 연결을 열는 데 사용되며 TCP 또는 UDP 소켓을 만드는 데 사용될 수 있습니다. 가장 기본적인 기능 프로토 타입은 다음과 같습니다.

 <span><span>resource </span><span><span class="hljs-title function_ invoke__">fsockopen</span></span><span> ( </span><span><span class="hljs-keyword">string</span></span><span> </span><span><span class="hljs-variable">$hostname</span></span><span> , </span><span><span class="hljs-keyword">int</span></span><span> </span><span><span class="hljs-variable">$port</span></span><span> [, </span><span><span class="hljs-keyword">int</span></span><span> &amp;</span><span><span class="hljs-variable">$errno</span></span><span> [, </span><span><span class="hljs-keyword">string</span></span><span> &amp;</span><span><span class="hljs-variable">$errstr</span></span><span> [, </span><span><span class="hljs-keyword">float</span></span><span> </span><span><span class="hljs-variable">$timeout</span></span><span> = </span><span><span class="hljs-title function_ invoke__">ini_get</span></span><span>(</span><span><span class="hljs-string">"default_socket_timeout"</span></span><span>) ]]] )
</span></span>
  • $ hostname : 대상 호스트 이름 또는 IP 주소.

  • $ 포트 : 대상 포트 번호.

  • $ errno$ errstr : 오류 메시지를 캡처하기위한 선택적 매개 변수.

  • $ 타임 아웃 : 선택적 연결 시간 초과, 초.

사용의 간단한 예 :

 <span><span><span class="hljs-meta">&lt;?php</span></span><span>
</span><span><span class="hljs-variable">$host</span></span><span> = </span><span><span class="hljs-string">'www.example.com'</span></span><span>;
</span><span><span class="hljs-variable">$port</span></span><span> = </span><span><span class="hljs-number">80</span></span><span>;
</span><span><span class="hljs-variable">$timeout</span></span><span> = </span><span><span class="hljs-number">30</span></span><span>; </span><span><span class="hljs-comment">// 시간 초과 시간을 설정하십시오 30 두번째</span></span><span>

</span><span><span class="hljs-comment">// 사용 fsockopen 연결을 설정하십시오</span></span><span>
</span><span><span class="hljs-variable">$socket</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fsockopen</span></span><span>(</span><span><span class="hljs-variable">$host</span></span><span>, </span><span><span class="hljs-variable">$port</span></span><span>, </span><span><span class="hljs-variable">$errno</span></span><span>, </span><span><span class="hljs-variable">$errstr</span></span><span>, </span><span><span class="hljs-variable">$timeout</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-keyword">echo</span></span><span> </span><span><span class="hljs-string">"실수: <span class="hljs-subst">$errno</span></span></span><span> - </span><span><span class="hljs-subst">$errstr</span></span><span>&lt;br /&gt;\n";
} </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 class="hljs-subst">$host</span></span></span><span>:</span><span><span class="hljs-subst">$port</span></span><span>&lt;br /&gt;\n";
    </span><span><span class="hljs-title function_ invoke__">fclose</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>);
}
</span><span><span class="hljs-meta">?&gt;</span></span><span>
</span></span>

2. 데이터 전송을 위해 FSOCOPEN을 사용하십시오

연결이 설정되면 서버로 데이터 전송을 시작할 수 있습니다. HTTP 프로토콜 통신의 경우 일반적으로 요청 헤더를 보내야하며 서버는 해당 데이터에 응답합니다. 간단한 HTTP 요청 예는 다음과 같습니다.

 <span><span><span class="hljs-meta">&lt;?php</span></span><span>
</span><span><span class="hljs-variable">$host</span></span><span> = </span><span><span class="hljs-string">'www.example.com'</span></span><span>;
</span><span><span class="hljs-variable">$port</span></span><span> = </span><span><span class="hljs-number">80</span></span><span>;
</span><span><span class="hljs-variable">$timeout</span></span><span> = </span><span><span class="hljs-number">30</span></span><span>;

</span><span><span class="hljs-variable">$socket</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fsockopen</span></span><span>(</span><span><span class="hljs-variable">$host</span></span><span>, </span><span><span class="hljs-variable">$port</span></span><span>, </span><span><span class="hljs-variable">$errno</span></span><span>, </span><span><span class="hljs-variable">$errstr</span></span><span>, </span><span><span class="hljs-variable">$timeout</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-keyword">echo</span></span><span> </span><span><span class="hljs-string">"실수: <span class="hljs-subst">$errno</span></span></span><span> - </span><span><span class="hljs-subst">$errstr</span></span><span>&lt;br /&gt;\n";
} </span><span><span class="hljs-keyword">else</span></span><span> {
    </span><span><span class="hljs-comment">// 짓다 HTTP 헤더를 요청하십시오</span></span><span>
    </span><span><span class="hljs-variable">$request</span></span><span> = </span><span><span class="hljs-string">"GET / HTTP/1.1\r\n"</span></span><span>;
    </span><span><span class="hljs-variable">$request</span></span><span> .= </span><span><span class="hljs-string">"Host: <span class="hljs-subst">$host</span></span></span><span>\r\n";
    </span><span><span class="hljs-variable">$request</span></span><span> .= </span><span><span class="hljs-string">"Connection: close\r\n"</span></span><span>;
    </span><span><span class="hljs-variable">$request</span></span><span> .= </span><span><span class="hljs-string">"\r\n"</span></span><span>;

    </span><span><span class="hljs-comment">// 요청을 보내십시오</span></span><span>
    </span><span><span class="hljs-title function_ invoke__">fwrite</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>, </span><span><span class="hljs-variable">$request</span></span><span>);

    </span><span><span class="hljs-comment">// 서버 응답을 수신하고 출력합니다</span></span><span>
    </span><span><span class="hljs-keyword">while</span></span><span> (!</span><span><span class="hljs-title function_ invoke__">feof</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>)) {
        </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-title function_ invoke__">fgets</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>, </span><span><span class="hljs-number">128</span></span><span>);
    }

    </span><span><span class="hljs-title function_ invoke__">fclose</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>);
}
</span><span><span class="hljs-meta">?&gt;</span></span><span>
</span></span>

위의 코드에서는 fsocopen을 사용하여 연결을 설정 한 다음 Fwrite 기능을 통해 HTTP 요청 헤더를 서버로 보내고 FGETS 기능을 사용하여 서버에서 반환 한 데이터를 읽습니다. 마지막으로 Fclose를 통해 소켓 연결을 닫습니다.

3. 일반적인 팁과 예방 조치

3.1 시간 초과 설정

네트워크 프로그래밍에서 특히 원격 서버와 상호 작용할 때 합리적인 시간 초과를 설정하는 것이 매우 중요합니다. 연결 시간 초과는 FSOCOPEN$ 타임 아웃 매개 변수를 통해 제어 할 수 있습니다. 설정 한 시간 초과가 너무 짧으면 조기 연결 중단이 발생할 수 있습니다. 너무 길면 프로그램이 연결할 수 없을 때 프로그램이 중단 될 수 있습니다. 일반적으로 30 초 이내에 시간 초과를 설정하는 것이 좋습니다.

 <span><span><span class="hljs-variable">$timeout</span></span><span> = </span><span><span class="hljs-number">10</span></span><span>; </span><span><span class="hljs-comment">// 시간 초과를 설정하십시오 10 두번째</span></span><span>
</span></span>

3.2 오류 처리

FSOCCKOPEN 함수의 반환 값은 리소스 유형 (소켓 연결 핸들)이며 연결에 실패하면 False가 반환됩니다. 오류를 피하고 처리하려면 상세 기록에 오류 코드 $ errno 와 오류 메시지 $ errstr를 사용하는 것이 좋습니다.

 <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-keyword">echo</span></span><span> </span><span><span class="hljs-string">"연결이 실패했습니다:<span class="hljs-subst">$errno</span></span></span><span> - </span><span><span class="hljs-subst">$errstr</span></span><span>&lt;br /&gt;\n";
    </span><span><span class="hljs-keyword">exit</span></span><span>;
}
</span></span>

3.3 데이터 전송 모드

HTTP 요청을 보내는 것 외에도 FSOCOPEN은 FTP, SMTP, POP3 등과 같은 다른 프로토콜의 데이터를 보내는 데 사용될 수 있습니다. 프로토콜에 관계없이 핵심 아이디어는 FWRRITE , FREAD 또는 FGES를 통해 데이터를 전송하여 응답을 얻는 것입니다. 프로토콜에 따라 데이터 형식이 변경 될 수 있습니다. 데이터를 보내기 전에 대상 프로토콜의 요청 형식에 익숙해지는 것이 좋습니다.

3.4 지속적인 연결

경우에 따라 서버와의 장기 연결을 유지하는 것이 바람직 할 수 있으며, 이는 HTTP 지속적인 연결 (유지)을 통해 달성 할 수 있습니다. 연결 추가 : 요청 헤더에서 유지를 유지하면 여러 요청간에 연결을 풀 수 있습니다.

 <span><span><span class="hljs-variable">$request</span></span><span> = </span><span><span class="hljs-string">"GET / HTTP/1.1\r\n"</span></span><span>;
</span><span><span class="hljs-variable">$request</span></span><span> .= </span><span><span class="hljs-string">"Host: <span class="hljs-subst">$host</span></span></span><span>\r\n";
</span><span><span class="hljs-variable">$request</span></span><span> .= </span><span><span class="hljs-string">"Connection: keep-alive\r\n"</span></span><span>;
</span><span><span class="hljs-variable">$request</span></span><span> .= </span><span><span class="hljs-string">"\r\n"</span></span><span>;
</span></span>

3.5 프록시 서버 사용

때로는 프록시 서버를 통해 대상 서버와 통신해야 할 수도 있습니다. 현재 프록시 서버의 주소와 포트는 대상 서버에 직접 연결하는 대신 fsocopen 으로 전달 될 수 있습니다.

 <span><span><span class="hljs-variable">$proxy</span></span><span> = </span><span><span class="hljs-string">'proxy.example.com'</span></span><span>;
</span><span><span class="hljs-variable">$proxyPort</span></span><span> = </span><span><span class="hljs-number">8080</span></span><span>;

</span><span><span class="hljs-variable">$socket</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fsockopen</span></span><span>(</span><span><span class="hljs-variable">$proxy</span></span><span>, </span><span><span class="hljs-variable">$proxyPort</span></span><span>, </span><span><span class="hljs-variable">$errno</span></span><span>, </span><span><span class="hljs-variable">$errstr</span></span><span>, </span><span><span class="hljs-variable">$timeout</span></span><span>);
</span></span>

프록시 서버에는 특정 인증 정보 (예 : 사용자 이름 및 비밀번호)가 필요할 수 있으며, 현재 요청 헤더는 프록시 프로토콜의 요구 사항에 따라 구성해야합니다.

4. 요약

FSOCCKOPEN 은 PHP에서 매우 강력한 기능으로 저수준 네트워크 통신에 적합합니다. 원격 서버로 데이터를 교환 해야하는 경우 FSOCOPEN은 직간접적인 방법을 제공합니다. 기본 사용 방법, 시간 초과 설정, 오류 처리 및 공통 프로토콜의 전송 기술을 마스터하면 소켓 데이터 전송을보다 효율적으로 실현하는 데 도움이됩니다. 실제 애플리케이션에서 요구 사항에 따라 매개 변수를 조정하고 네트워크 요청의 안정성을 확인하십시오.