pid_ioctl함수의 get명령어로 TCP의 각종 상태를 확인 할 수 있습니다.
$return = pid_ioctl($pid, "get ITEM");
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_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 종료
?>