TCP 상태정보 확인


pid_ioctl함수의 get명령어로 TCP의 각종 상태를 확인 할 수 있습니다.

$return = pid_ioctl($pid, "get ITEM");

확인 가능한 TCP 상태정보

ITEM 설명 반환 값 반환 형식
state TCP 세션 상태 - 접속 끊김 TCP_CLOSED 정수
TCP 세션 상태 - 접속 완료 TCP_CONNECTED 정수
TCP 세션 상태 - 접속 대기 TCP_LISTEN 정수
SSL 세션 상태 - 접속 끊김 SSL_CLOSED 정수
SSL 세션 상태 - 접속 완료 SSL_CONNECTED 정수
SSL 세션 상태 - 접속 대기 SSL_LISTEN 정수
srcaddr 장치의 로컬 IP주소 예) 192.168.0.1 문자열
srcport 장치의 로컬 TCP 포트번호 예) 1470 정수
dstaddr TCP통신 상대방의 IP주소 예) 192.168.0.2 문자열
dstport TCP통신 상대방의 포트번호 예) 1470 정수
txbuf 송신버퍼 크기[Byte] 예) 1152 정수
txfree 송신버퍼 여유공간[Byte] 예) 1152 정수
rxbuf 수신버퍼 크기[Byte] 예) 1068 정수
rxlen 수신 데이터 량[Byte] 예) 200 정수

TCP세션 상태

TCP는 접속과정 이후에 데이터통신을 하므로 TCP세션의 상태를 확인하는 것은 매우 중요합니다. 상태 값은 접속이 되지 않았거나 이미 끊긴 상태를 나타내는 TCP_CLOSED, 접속이 완료 된 상태인 TCP_CONNECTED, TCP서버로서 접속을 대기하고 있는 상태인 TCP_LISTEN의 세 가지 입니다. SSL도 마찬가지로 접속 안 됨, 접속 완료 및 접속 대기의 세 가지 상태가 있습니다. 이 값들은 모두 PHPoC에서 미리 정의된 상수(predefined constant)입니다.
모든 세션의 상태는 다음과 같이 확인할 수 있습니다.

<?php
$state = pid_ioctl($pid, "get state");
?>

※ TCP 또는 SSL접속을 시도하는 중이거나 종료하는 중일 때 세션의 상태정보를 확인하는 경우 위 표에 나온 값들 이외의 값들이 반환 될 수 있습니다. 이 값들은 펌웨어 내부적으로만 사용되는 상수이며 향후 변경의 소지가 있으므로 사용자는 프로그래밍에 사용하지 마십시오.

송신버퍼에 남아있는 데이터 크기

TCP 송신버퍼에 남아있는 데이터 크기는 다음과 같이 계산할 수 있습니다.

송신버퍼에 남아있는 데이터 크기 = 송신버퍼 크기 - 송신버퍼 여유공간

사용 예

이 예제는 TCP접속 후 8바이트를 전송하고 TCP 송신버퍼에 남아있는 데이터 크기를 계산하여 출력합니다.

<?php
$tx_len = -1;
$pid = pid_open("/mmap/tcp0");                // 0번 TCP 열기
pid_bind($pid, "", 0);                        // 바인딩
do
{
    pid_connect($pid, "10.1.0.2", 1470);      // TCP 능동접속
    usleep(500000);
}
while(pid_ioctl($pid, "get state") != TCP_CONNECTED);
pid_send($pid, "01234567");                   // 8바이트 전송
while($tx_len && (pid_ioctl($pid, "get state") == TCP_CONNECTED))
{
    $txbuf = pid_ioctl($pid, "get txbuf");    // 송신버퍼 크기 확인
    $txfree = pid_ioctl($pid, "get txfree");  // 송신버퍼 여유공간 확인
    $tx_len = $txbuf - $txfree;               // 송신버퍼에 남아있는 데이터 크기 확인
    echo "tx len = $tx_len\r\n";              // 송신버퍼에 남아있는 데이터 크기 출력
    usleep(10000);
}
pid_close($pid);                              // TCP 종료
?>

수신 데이터 크기

TCP에서 수신한 데이터 크기는 다음과 같이 확인 할 수 있습니다.

$rxlen = pid_ioctl($pid, "get rxlen[ $string]");

특정 문자(열)까지 수신한 데이터 크기 확인하기

rxlen명령어 뒤에 특정 문자열($string)을 입력하면 pid_ioctl함수는 해당 문자열이 들어오기 전까지는 0을 반환하다가 해당 문자열이 들어오면 그 문자열까지의 수신 데이터 크기를 반환합니다.

수신버퍼 여유공간

TCP 수신버퍼 여유공간은 다음과 같이 계산할 수 있습니다.

수신버퍼 여유공간 = 수신버퍼 크기 - 수신 데이터 크기

사용 예

이 예제는 TCP접속 후 수신버퍼의 여유공간을 계산하여 출력합니다.

<?php
$rx_free = 1068;
$pid = pid_open("/mmap/tcp0");               // 0번 TCP 열기
pid_bind($pid, "", 0);                       // 바인딩
do
{
    pid_connect($pid, "10.1.0.2", 1470);     // TCP 능동접속
    usleep(500000);
}
while(pid_ioctl($pid, "get state") != TCP_CONNECTED);

while(($rx_free > 500) && (pid_ioctl($pid, "get state") == TCP_CONNECTED))
{
    $rxbuf = pid_ioctl($pid, "get rxbuf");   // 수신버퍼 크기 확인
    $rxlen = pid_ioctl($pid, "get rxlen");   // 수신 데이터 크기 확인
    $rx_free = $rxbuf - $rxlen;              // 수신버퍼 여유공간 확인
    echo "rx free = $rx_free\r\n";           // 수신버퍼 여유공간 출력
    sleep(1);
}
pid_close($pid);                             // TCP 종료
?>