Подтвердить что ты не робот

Поток сокетов с SSL

У меня проблема с потоковым сокетом и SSL в PHP 5.6. Кажется, что SSL является буферизацией. В приведенном ниже примере команда "ehlo" игнорируется (сервер не отвечает). Но когда что-то еще отправляется после "ehlo", например. новая строка в другом вызове fwrite, сервер отправляет ответ.

$errno = '';
$errstr = '';
$timeout = 5;
$streamContext = stream_context_create();
$host = 'ssl://smtp.some.server.com:465';
$stream = stream_socket_client($host, $errno, $errstr, $timeout, STREAM_CLIENT_CONNECT, $streamContext);
stream_set_blocking($stream, 1);
stream_set_timeout($stream, $timeout);
stream_set_write_buffer($stream, 0);

$fgets = fgets($stream);
print_r($fgets);

fwrite($stream, "ehlo [127.0.0.1]\r\n");

$response = '';
do {
    $line = fgets($stream);
    $response .= $line;
} while (null !== $line && false !== $line && ' ' != $line{3});

print_r($response);

fclose($stream);

У меня есть ответ:

220 epicserver.net.pl ESMTP IdeaSmtpServer v0.80.2 ready.

(это сначала print_r).

Но когда после строки: fwrite($stream, "ehlo [127.0.0.1]\r\n"); Я добавляю дополнительную запись сокета: fwrite($stream, "\n"); вывод в порядке:

220 epicserver.net.pl ESMTP IdeaSmtpServer v0.80.2 ready.
250-epicserver.net.pl Hello ip-166-242.pl [94.183.162.232], pleased to meet you
250-PIPELINING
250-ENHANCEDSTATUSCODES
250-SIZE
250-8BITMIME
250-AUTH PLAIN LOGIN
250-AUTH=PLAIN LOGIN
250 HELP

Я попытался использовать stunnel, чтобы проверить, не является ли это проблемой для оболочки PHP SSL, и когда я меняю $host на $host = 'localhost:110;' (моя конфигурация stunnel), все работает отлично (без добавления этого специального метода fwrite).

Кто-нибудь сталкивался с этой проблемой?

4b9b3361

Ответ 1

Замените 1st fgets на этот код, чтобы убедиться, что fgets правильно понимает окончание строки:

$fgets = '';
while (is_resource($stream) && !feof($stream)) {
  $fgets .= fgets($stream); 
}