Для получения статуса/состояния TCP необходима команда функции pid_ioctl.
$return = pid_ioctl($pid, "get ITEM");
ITEM/элемент | Описание | Возврат значений | Возвращаемый тип |
---|---|---|---|
state | TCP session is closed | TCP_CLOSED | целое число |
TCP session is connected | TCP_CONNECTED | целое число | |
TCP session waits for connection | TCP_LISTEN | целое число | |
SSL session is closed | SSL_CLOSED | целое число | |
SSL session is connected | SSL_CONNECTED | целое число | |
SSL session waits for connection | SSL_LISTEN | целое число | |
SSL session is closed | SSH_CLOSED | целое число | |
SSL session is connected | SSH_CONNECTED | целое число | |
SSL session waits for connection | SSH_LISTEN | целое число | |
SSL authentication is completed | SSH_AUTH | целое число | |
srcaddr | local IP address | e.g. 192.168.0.1 | строка |
srcport | local port number | e.g. 1470 | целое число |
dstaddr | peer IP address | e.g. 192.168.0.2 | строка |
dstport | peer TCP number | e.g. 1470 | целое число |
txbuf | size of send buffer[Byte] | e.g. 1152 | целое число |
txfree | remaining send buffer size[Byte] | e.g. 1152 | целое число |
rxbuf | size of receive buffer[Byte] | e.g. 1068 | целое число |
rxlen | received data size[Byte]/td> | e.g. 200 | целое число |
ssh username | SSH user name | e.g. user | целое число |
ssh password | SSH password | e.g. password | строка |
Проверка состояния соединения по TCP очень важна, потому что передача данных TCP осуществляется после этапа соединения/подключения. Существуют три состояния сеанса: TCP_CLOSED, когда сеанс не подключен; TCP_CONNECTED, когда сеанс подключен и TCP_LISTEN, когда TCP-сервер прослушивает соединение. SSL и SSH также имеют 3 статуса/состояния: SSL_CLOSED, SSL_CONNECTED и SSL_LISTEN, а SSH имеет также дополнительное сосотояние об аутентификации (SSH_AUTH). Ниже показано, как получить состояние сеанса.
$state = pid_ioctl($pid, "get state");
※ Неизвестное значение, которое не указано в таблице выше, может быть возвращено, если вы пытаетесь получить состояние, когда PHPoC подключается или закрывает соединение. Обратите внимание, что не рекомендуется использовать эти значения в вашем сценарии, так как он может быть изменен в будущем.
Оставшийся размер данных в буфере отправки может быть рассчитан следующим образом:
размер оставшихся данных в буфере отправки = размер буфера - оставшийся размер буфера
В этом примере, PHPoC отправляет 8 байтов данных на сервер сразу после установки TCP-соединения. При отправке данных, PHPoC выводит оставшийся размер данных в буфере отправки.
$tx_len = -1;
$pid = pid_open("/mmap/tcp0"); // open TCP 0
do
{
pid_connect($pid, "10.1.0.2", 1470); // TCP active connection
usleep(500000);
}
while(pid_ioctl($pid, "get state") != TCP_CONNECTED);
pid_send($pid, "01234567"); // send 8 bytes
while($tx_len && (pid_ioctl($pid, "get state") == TCP_CONNECTED))
{
$txbuf = pid_ioctl($pid, "get txbuf"); // get the size of send buffer
// get the empty size of send buffer
$txfree = pid_ioctl($pid, "get txfree");
// calculate the size of remaining data in send buffer
$tx_len = $txbuf - $txfree;
echo "tx len = $tx_len\r\n"; // print the result
usleep(10000);
}
pid_close($pid); // close TCP
Ниже показано, как получить размер полученных данных из сокета TCP.
$rxlen = pid_ioctl($pid, "get rxlen[ $string]");
Если после команды "get rxlen" указана строка, функция pid_ioctl возвращает 0 до тех пор, пока строка не войдет в сокет TCP. Если указанная строка встречается, функция возвращает весь размер данных, включая строку.
Оставшийся размер буфера приема может быть расчитан следующим образом:
сставшийся размер буфера приема = размер буфера - размер полученных данных
В данном примере показано, как получить оставшийся размер буфера приема.
$rx_free = 1068;
$pid = pid_open("/mmap/tcp0"); // open TCP 0
do
{
pid_connect($pid, "10.1.0.2", 1470); // TCP active connection
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"); // get the size of receive buffer
$rxlen = pid_ioctl($pid, "get rxlen"); // get the size of received data
// calculate the available space of receive buffer
$rx_free = $rxbuf - $rxlen;
echo "rx free = $rx_free\r\n"; // print the result
sleep(1);
}
pid_close($pid); // close TCP