TCP 데이터 통신


TCP 데이터 수신

네트워크로부터 들어온 TCP데이터는 수신버퍼에 저장됩니다.
이 수신버퍼에 저장 된 값을 pid_recv함수로 읽습니다.

tcp communication 01

pid_recv함수는 다음과 같이 사용합니다.

pid_recv($pid, $value[, $len]);

사용 예

이 예제는 매 초마다 TCP로 수신되는 데이터를 확인하고 출력합니다.

<?php
$rdata = "";
$pid = pid_open("/mmap/tcp0");               // 0번 TCP 열기
pid_bind($pid, "", 0);                       // 바인딩
pid_connect($pid, "10.1.0.2", 1470);         // TCP 접속
do
{
    sleep(1);
    $state = pid_ioctl($pid, "get state");   // TCP세션 상태 확인
    $rxlen = pid_ioctl($pid, "get rxlen");   // 수신 데이터 크기 확인
    $rlen = pid_recv($pid, $rdata, $rxlen);  // 데이터 읽기
    echo "rlen = $rlen / ";                  // 읽은 데이터 크기 출력
    echo "rdata = $rdata\r\n";               // 읽은 데이터 출력
    if($rlen)
        $rdata = "";                         // 수신버퍼 초기화
}
while($state == TCP_CONNECTED);
pid_close($pid);
?>

TCP 데이터 송신

pid_send함수를 이용해 송신한 데이터는 송신버퍼에 저장되었다가 네트워크로 전송됩니다.

tcp communication 01

pid_send함수는 다음과 같이 사용합니다.

pid_send($pid, $value[, $len]);

사용 예

이 예제는 송신버퍼의 여유공간을 확인하여 TCP로 데이터를 송신합니다.

<?php
$sdata = "0123456789";
$pid = pid_open("/mmap/tcp0");                   // 0번 TCP 열기
pid_bind($pid, "", 0);                           // 바인딩
pid_connect($pid, "10.1.0.2", 1470);             // TCP 접속
do
{
    sleep(1);
    $state = pid_ioctl($pid, "get state");       // TCP세션 상태 확인
    $txfree = pid_ioctl($pid, "get txfree");     // 버퍼 여유공간 확인
    $tx_len = pid_send($pid, $sdata, $txfree);   // 데이터 송신
    echo "tx len = $tx_len\r\n";                 // 송신 한 데이터 크기 출력
}
while($state == TCP_CONNECTED);
pid_close($pid);
?>

위 코드에서 pid_send함수의 세 번째 인수는 송신할 데이터의 크기를 의미합니다. 송신 데이터크기가 송신버퍼의 여유공간보다 크면 데이터가 유실될 수 있습니다. 따라서 항상 버퍼 여유공간을 확인한 후 그 값 또는 그 이하로 쓰기 데이터 크기를 설정하는 것을 권장합니다.