2015-01-20 6 views
0

먼저 오류없이 작동하는 non tls를 사용하여 xmpp 서버를 생성했습니다. 구멍 인증이 작동하고 아무 문제없이 채팅 할 수 있습니다. 내가했던 소켓에서 읽기 시작하기 전에stream_socket_enable_crypto(); stream_set_timeout을 사용 중지합니다.

:

stream_set_timeout($sock, 0, 1000); 

이 서버에서 새로운 데이터가없는 경우 나 시간 내에 일을 할 수있게된다.

이제 시작점을 구현했습니다. 내가 했어

stream_socket_enable_crypto($sock, true, STREAM_CRYPTO_METHOD_TLS_SERVER); 

나는 나를 위해 tls를 협상한다. 읽기 시간 초과가 발생하여 협상이 실패했기 때문에이 작업이 수행되지 않았습니다.

나는 조금 더 시간 제한을 설정하려면

stream_set_timeout($sock, 30, 0); 
stream_socket_enable_crypto($sock, true, STREAM_CRYPTO_METHOD_TLS_SERVER); 
stream_set_timeout($sock, 0, 1000); 

에 위의 stream_socket_enable_crypto을 변경, 그래서 클라이언트는 (자기 signged 경우) 인증서를 수락하고 모든 TLS 물건을 30 초 시간을 가지고있다. 이 작업이 끝나면 실제로 타임 아웃을 다시 1000 마이크로 초로 설정해야합니다. 이 변경 후에 TLS 협상이 작동했지만 시간 제한 설정이 손실되었습니다.

이것은 내 문제입니다. 2 stream_set_timeoutstream_socket_enable_crypto 이후에 호출이 작동하지 않습니다.

나는 로그 항목

echo "AFTER PROCESS MESSAGE QUEUE\n"; 
$buffer = fread($sock, 4096); 
echo "AFTER SOCKET READ\n"; 

PROCESS 메시지 큐가 인쇄 된 후 메시지 하지만 소켓 READ가 인쇄되지 후 을 가지고 내가 기다리는 시간을 중요하지 않습니다.

아무도 내가 스트림 읽기 시간 초과를 1000 마이크로 초로 다시 설정할 수있는 방법이 있습니까? 귀하의 정보에 대한

: 내가 거짓으로 stream_set_blocking 것은 현재 이 원하는하지입니다 설정해야 해결책. 현재로서는 차단 솔루션 만 필요합니다. 비 차단을 사용하는 다른 솔루션이 없다면 당연히 알고 싶습니다. :)

답변

1

같은 문제가있었습니다. * 표시된 코드는 질문에 제시된 문제가 해결 왜 당신은 또한 * 설명해야, 코드를 보여주기 위해 항상 좋은 반면

$buffer=''; 
$select=array('con1'=>$socket); 
$timeout_sec=1; 
if(stream_select($select, $null, $null, $timeout_sec)){ 
    $buffer = fread($socket, $size); 
} 
+0

: stream_select 내가 문제를 해결 도움이되었다. 설명을 추가하려면 답을 편집하십시오. –

관련 문제