Получение статуса TCP


Для получения статуса/состояния TCP необходима команда функции pid_ioctl.

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

Доступные статусы/состояния TCP

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 осуществляется после этапа соединения/подключения. Существуют три состояния сеанса: 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