- Я написал очень простой сокет-сервер.
- Он прослушивает сообщение 63254.
- Сначала я сделал socket_create, socket_bind, socket_listen, поэтому здесь прослушивается соединение.
- Затем в цикле я делаю розетку accpet.так что здесь другое прослушивание.
- функция чтения читает до ввода ввода.
- после этого закрывается идентификатор ресурса с помощью socket_accept.
- и затем закрывается основное соединение.
Когда я проверил этот процесс в TCPview после закрытия всех соединений, я все еще могу видеть, как системный процесс показывает TIME_WAIT для сообщения 63254
, если я снова запускаю программу сервера сокетов, к которой он подключается, и когда одинполный процесс завершен, все соединение закрыто, и программа завершена, и теперь я могу видеть другое TIME_WAIT для того же порта.но все же я мог подключиться к тому же порту в третий раз.
в ответе на вопрос о стеке сказано, что невозможно установить соединение для порта, который находится в состоянии ожидания.
Я открыл браузер Firefox этооткрыл 4 соединения.когда я закрыл все это закрыто, и системный процесс показал 4 времени ожидания в течение 2 минут.ожидание все время остается в течение 2 минут и исчезает.
, поэтому я прихожу к выводу, что при каждом закрытии соединения происходит ожидание времени, которого нельзя избежать.
Я прочитал много сообщений в потоке переполнения стека, новсе еще не был уверен в этом.
я запускаю следующий код в командной строке.
Код моего сервера
<?
error_reporting(E_ALL);
set_time_limit(0);
ob_implicit_flush();
$str = '';
$buff = '';
$s = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if(!$s)die('Unable to create socket');
if(!socket_bind($s,'127.0.0.1',63254))
die("\nTrying to Bind: ".socket_strerror(socket_last_error()));
if(!socket_listen($s,1))
die(socket_strerror(socket_last_error()));
while(1)
{
$acc = socket_accept($s);
if(!$acc)die(socket_strerror(socket_last_error()));
// echo "\n".gettype($acc);
if(!$acc)die(socket_strerror(socket_last_error()));
while(1)
{
$str = socket_read($acc,512);
$buff.= $str;
echo $str;
// echo '::'.gettype($str);
if($str===false)die(socket_strerror(socket_last_error()));
if($str=="exit\r\n")break;
}
// if(!socket_shutdown($acc,2))echo socket_strerror(socket_last_error());
socket_close($acc);
if(preg_match('/exit/',$buff))break;
}
//echo "\nConnection closed by server\n";
//if(!socket_shutdown($s,2))echo socket_strerror(socket_last_error());
socket_close($s);
?>
Код клиента
<?
set_time_limit(0);
$f = fsockopen('127.0.0.1',63254,$a,$b,10);
if(!$f)die('cannot connect');
echo "\nConnected: \n";
do{
$buff = fgets(STDIN);
fwrite($f,$buff);
}while($buff!="exit\r\n");
fclose($f);
?>
нужны предложения по улучшению лучшего клиентского сервера, если этого недостаточно.этот код просто детская игра.просто пытаюсь понять, как работает связь.