현재 위치: > 최신 기사 목록> socket_sendmsg 함수를 사용하여 socket_recvmsg를 기반으로 양방향 통신을 구현하는 방법은 무엇입니까?

socket_sendmsg 함수를 사용하여 socket_recvmsg를 기반으로 양방향 통신을 구현하는 방법은 무엇입니까?

M66 2025-07-04

PHP에서 소켓 기반 양방향 통신은 일반적인 네트워크 프로그래밍 작업입니다. 효율적인 메시징과 관련하여 Socket_SendmsgSocket_Recvmsg는 개발자가보다 유연하고 복잡한 커뮤니케이션 모드를 달성 할 수 있도록보다 고급 기능을 제공 할 수 있습니다. 이 기사에서는 Socket_Sendmsg를 Socket_Recvmsg 와 함께 사용하여 양방향 통신을 달성하는 방법을 살펴 봅니다.

1. Socket_sendmsgsocket_recvmsg 소개

먼저이 두 기능의 기본 사용을 이해해야합니다.

  • Socket_sendmsg :이 기능은 지정된 소켓으로 데이터를 보내는 데 사용되며 추가 플래그, 제어 정보 또는 첨부 데이터 데이터를 전달할 수 있습니다. 그것과 socket_send 의 주요 차이점은 socket_sendmsg 가보다 강력한 유연성을 제공하고보다 복잡한 데이터 구조를 지원할 수 있다는 것입니다.

  • socket_recvmsg :이 기능은 소켓에서 메시지를 수신하는 데 사용됩니다. 수신 할 수있는 메시지는 데이터를 포함 할뿐만 아니라 발신자 주소, 데이터 메타 데이터 등과 같은 일부 제어 정보를 포함 할 수도 있습니다. Socket_recv 와 비교하여 더 많은 통신 정보를 반환하여 양방향 통신을보다 유연하게 만들 수 있습니다.

2. 양방향 통신의 작동 방식

실제 응용 분야에서 양방향 커뮤니케이션은 종종 양 당사자가 서로 데이터를 보내고받을 수 있어야한다는 것을 의미합니다. socket_sendmsgsocket_recvmsg를 사용하면이를 효율적으로 달성 할 수 있습니다. 이 두 기능은 메시지 헤더 및 데이터 부분을 제어하여보다 유연하게 상호 작용할 수 있습니다.

2.1 소켓 연결 초기화

먼저 소켓을 통해 소켓을 초기화해야합니다. 다음으로 바인딩 또는 연결에 socket_bind 또는 socket_connect를 사용할 수 있습니다.

 <span><span><span class="hljs-comment">// 만들다 Socket</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_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">"Socket 만들다失败: "</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-keyword">exit</span></span><span>();
}

</span><span><span class="hljs-comment">// 서버에 연결하십시오</span></span><span>
</span><span><span class="hljs-variable">$address</span></span><span> = </span><span><span class="hljs-string">'127.0.0.1'</span></span><span>;
</span><span><span class="hljs-variable">$port</span></span><span> = </span><span><span class="hljs-number">8080</span></span><span>;
</span><span><span class="hljs-variable">$result</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-variable">$address</span></span><span>, </span><span><span class="hljs-variable">$port</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$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-keyword">exit</span></span><span>();
}
</span></span>

2.2 socket_sendmsg를 사용하여 메시지를 보냅니다

socket_sendmsg 함수를 사용하면 복잡한 데이터 구조가 포함 된 메시지를 보낼 수 있습니다. 일반적으로 추가 제어 정보를 포함 할 수있는 MSGHDR 구조로 데이터를 캡슐화합니다. 예를 들어, 보낸 플래그 비트, 추가 데이터, 대상 주소 등을 지정하십시오.

 <span><span><span class="hljs-variable">$msg</span></span><span> = </span><span><span class="hljs-string">"Hello, Server!"</span></span><span>;
</span><span><span class="hljs-variable">$len</span></span><span> = </span><span><span class="hljs-title function_ invoke__">strlen</span></span><span>(</span><span><span class="hljs-variable">$msg</span></span><span>);

</span><span><span class="hljs-comment">// 만들다一个消息头</span></span><span>
</span><span><span class="hljs-variable">$msgHdr</span></span><span> = </span><span><span class="hljs-keyword">array</span></span><span>(
    </span><span><span class="hljs-string">'msg_name'</span></span><span> =&gt; </span><span><span class="hljs-literal">null</span></span><span>,           </span><span><span class="hljs-comment">// 기본 대상 주소가 비어 있습니다</span></span><span>
    </span><span><span class="hljs-string">'msg_namelen'</span></span><span> =&gt; </span><span><span class="hljs-number">0</span></span><span>,
    </span><span><span class="hljs-string">'msg_iov'</span></span><span> =&gt; </span><span><span class="hljs-keyword">array</span></span><span>(</span><span><span class="hljs-keyword">array</span></span><span>(</span><span><span class="hljs-string">'iov_base'</span></span><span> =&gt; </span><span><span class="hljs-variable">$msg</span></span><span>, </span><span><span class="hljs-string">'iov_len'</span></span><span> =&gt; </span><span><span class="hljs-variable">$len</span></span><span>)),  </span><span><span class="hljs-comment">// 데이터 컨텐츠</span></span><span>
    </span><span><span class="hljs-string">'msg_iovlen'</span></span><span> =&gt; </span><span><span class="hljs-number">1</span></span><span>,
    </span><span><span class="hljs-string">'msg_control'</span></span><span> =&gt; </span><span><span class="hljs-literal">null</span></span><span>,
    </span><span><span class="hljs-string">'msg_controllen'</span></span><span> =&gt; </span><span><span class="hljs-number">0</span></span><span>,
    </span><span><span class="hljs-string">'msg_flags'</span></span><span> =&gt; </span><span><span class="hljs-number">0</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_sendmsg</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>, </span><span><span class="hljs-variable">$msgHdr</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-keyword">exit</span></span><span>();
}
</span></span>

2.3 Socket_RecVMSG를 사용하여 메시지를받습니다

socket_recvmsg 함수는 socket_sendmsg 와 상반되며 소켓에서 복잡한 데이터를 포함하는 메시지를 수신하는 데 사용됩니다. 데이터 부분 외에도 반환하는 메시지에는 발신자 주소, 로고 및 기타 정보가 포함될 수도 있습니다.

 <span><span><span class="hljs-comment">// 메시지를받을 준비를하는 버퍼</span></span><span>
</span><span><span class="hljs-variable">$buf</span></span><span> = </span><span><span class="hljs-string">""</span></span><span>;
</span><span><span class="hljs-variable">$bufLen</span></span><span> = </span><span><span class="hljs-number">1024</span></span><span>;
</span><span><span class="hljs-variable">$msgHdrRecv</span></span><span> = </span><span><span class="hljs-keyword">array</span></span><span>(
    </span><span><span class="hljs-string">'msg_name'</span></span><span> =&gt; </span><span><span class="hljs-literal">null</span></span><span>,
    </span><span><span class="hljs-string">'msg_namelen'</span></span><span> =&gt; </span><span><span class="hljs-number">0</span></span><span>,
    </span><span><span class="hljs-string">'msg_iov'</span></span><span> =&gt; </span><span><span class="hljs-keyword">array</span></span><span>(</span><span><span class="hljs-keyword">array</span></span><span>(</span><span><span class="hljs-string">'iov_base'</span></span><span> =&gt; &amp;</span><span><span class="hljs-variable">$buf</span></span><span>, </span><span><span class="hljs-string">'iov_len'</span></span><span> =&gt; </span><span><span class="hljs-variable">$bufLen</span></span><span>)),
    </span><span><span class="hljs-string">'msg_iovlen'</span></span><span> =&gt; </span><span><span class="hljs-number">1</span></span><span>,
    </span><span><span class="hljs-string">'msg_control'</span></span><span> =&gt; </span><span><span class="hljs-literal">null</span></span><span>,
    </span><span><span class="hljs-string">'msg_controllen'</span></span><span> =&gt; </span><span><span class="hljs-number">0</span></span><span>,
    </span><span><span class="hljs-string">'msg_flags'</span></span><span> =&gt; </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">$bytesReceived</span></span><span> = </span><span><span class="hljs-title function_ invoke__">socket_recvmsg</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>, </span><span><span class="hljs-variable">$msgHdrRecv</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$bytesReceived</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-keyword">exit</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">$buf</span></span><span> . </span><span><span class="hljs-string">"\n"</span></span><span>;
</span></span>

3. 전형적인 양방향 통신 프로세스

실제로, 양방향 통신의 기본 프로세스는 다음 단계로 요약 될 수 있습니다.

  1. 연결 설정 : 클라이언트는 Socket_Connect를 통해 서버에 연결하고 서버는 클라이언트가 Socket_Accept 를 통해 연결되기를 기다립니다.

  2. 메시지 보내기 : 클라이언트 또는 서버는 socket_sendmsg를 통해 메시지를 보낼 수 있습니다. 특정 제어 정보를 나타내도록 추가 데이터 또는 플래그 비트를 전달할 수 있습니다.

  3. 수신 메시지 : 수신기는 socket_recvmsg를 통해 메시지를 수신합니다. 수신 된 메시지에는 데이터 부분뿐만 아니라 일부 메타 데이터 (예 : 메시지 플래그, 발신자 등)도 포함됩니다.

  4. 대체 전송 및 수신 : 클라이언트와 서버는 양방향 데이터 교환에 socket_sendmsgsocket_recvmsg를 번갈아 사용합니다. 매번 다른 제어 정보 또는 더 복잡한 데이터 구조를 첨부 할 수 있습니다.

 <span><span><span class="hljs-comment">// 서버 측 코드 예제(단순화 된 버전)</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-title function_ invoke__">socket_bind</span></span><span>(</span><span><span class="hljs-variable">$serverSocket</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-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-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-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-variable">$header</span></span><span> = </span><span><span class="hljs-keyword">array</span></span><span>(
    </span><span><span class="hljs-string">'msg_name'</span></span><span> =&gt; </span><span><span class="hljs-literal">null</span></span><span>,
    </span><span><span class="hljs-string">'msg_namelen'</span></span><span> =&gt; </span><span><span class="hljs-number">0</span></span><span>,
    </span><span><span class="hljs-string">'msg_iov'</span></span><span> =&gt; </span><span><span class="hljs-keyword">array</span></span><span>(</span><span><span class="hljs-keyword">array</span></span><span>(</span><span><span class="hljs-string">'iov_base'</span></span><span> =&gt; &amp;</span><span><span class="hljs-variable">$buffer</span></span><span>, </span><span><span class="hljs-string">'iov_len'</span></span><span> =&gt; </span><span><span class="hljs-number">1024</span></span><span>)),
    </span><span><span class="hljs-string">'msg_iovlen'</span></span><span> =&gt; </span><span><span class="hljs-number">1</span></span><span>,
    </span><span><span class="hljs-string">'msg_control'</span></span><span> =&gt; </span><span><span class="hljs-literal">null</span></span><span>,
    </span><span><span class="hljs-string">'msg_controllen'</span></span><span> =&gt; </span><span><span class="hljs-number">0</span></span><span>,
    </span><span><span class="hljs-string">'msg_flags'</span></span><span> =&gt; </span><span><span class="hljs-number">0</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">$bytesReceived</span></span><span> = </span><span><span class="hljs-title function_ invoke__">socket_recvmsg</span></span><span>(</span><span><span class="hljs-variable">$clientSocket</span></span><span>, </span><span><span class="hljs-variable">$header</span></span><span>);
    </span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$bytesReceived</span></span><span> === </span><span><span class="hljs-literal">false</span></span><span>) {
        </span><span><span class="hljs-keyword">break</span></span><span>;
    }
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"고객으로부터 메시지를 받았습니다: <span class="hljs-subst">$buffer</span></span></span><span>\n";

    </span><span><span class="hljs-comment">// 고객에게 응답을 보내십시오</span></span><span>
    </span><span><span class="hljs-variable">$msg</span></span><span> = </span><span><span class="hljs-string">"Hello from server!"</span></span><span>;
    </span><span><span class="hljs-variable">$msgHdrSend</span></span><span> = </span><span><span class="hljs-keyword">array</span></span><span>(
        </span><span><span class="hljs-string">'msg_name'</span></span><span> =&gt; </span><span><span class="hljs-literal">null</span></span><span>,
        </span><span><span class="hljs-string">'msg_namelen'</span></span><span> =&gt; </span><span><span class="hljs-number">0</span></span><span>,
        </span><span><span class="hljs-string">'msg_iov'</span></span><span> =&gt; </span><span><span class="hljs-keyword">array</span></span><span>(</span><span><span class="hljs-keyword">array</span></span><span>(</span><span><span class="hljs-string">'iov_base'</span></span><span> =&gt; </span><span><span class="hljs-variable">$msg</span></span><span>, </span><span><span class="hljs-string">'iov_len'</span></span><span> =&gt; </span><span><span class="hljs-title function_ invoke__">strlen</span></span><span>(</span><span><span class="hljs-variable">$msg</span></span><span>))),
        </span><span><span class="hljs-string">'msg_iovlen'</span></span><span> =&gt; </span><span><span class="hljs-number">1</span></span><span>,
        </span><span><span class="hljs-string">'msg_control'</span></span><span> =&gt; </span><span><span class="hljs-literal">null</span></span><span>,
        </span><span><span class="hljs-string">'msg_controllen'</span></span><span> =&gt; </span><span><span class="hljs-number">0</span></span><span>,
        </span><span><span class="hljs-string">'msg_flags'</span></span><span> =&gt; </span><span><span class="hljs-number">0</span></span><span>
    );
    </span><span><span class="hljs-title function_ invoke__">socket_sendmsg</span></span><span>(</span><span><span class="hljs-variable">$clientSocket</span></span><span>, </span><span><span class="hljs-variable">$msgHdrSend</span></span><span>);
}
</span></span>

4. 요약

socket_sendmsgsocket_recvmsg 기능을 사용하면 소켓 기반 통신 효율성, 특히 복잡한 메시지가 필요하거나 추가 제어 정보가 전달되는 시나리오에서 크게 향상 될 수 있습니다. 그들의 유연성을 통해 개발자는 양방향 통신을 더 잘 실현하고 폴링 및 제어 메시지를 통해 데이터 교환을 완료 할 수 있습니다. 이러한 기능이 어떻게 사용되는지 이해하는 것은 효율적인 네트워크 통신을 달성하는 데 중요합니다.