2013-03-13 2 views
0

안녕하세요 socket_read 함수에 문제가 있습니다. 데이터 읽기를 마친 후 빈 문자열을 반환하지 않습니다. socket_read()에 대한 두 번째 호출에서 멈추지 만 페이지는 브라우저에서 계속 반환됩니다. 서버가 연결을 닫으면 서버에서 클라이언트 소켓을 닫아야합니까? 감사합니다PHP socket_read가 빈 문자열을 반환하지 않습니다. '

$json = $_GET['json']; 

    /* Get the port for the WWW service. */ 
    // $service_port = getservbyname('www', 'tcp'); 
    $service_port = "1111"; 

    /* Get the IP address for the target host. */ 
    $address = "192.168.3.5"; 

    /* Create a TCP/IP socket. */ 
    $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); 
    if ($socket === false) { 
     echo "socket_create() failed: reason: " . socket_strerror(socket_last_error()) . "\n"; 
     die(); 
    } else { 
     //echo "OK.\n"; 
    } 

    //echo "Attempting to connect to '$address' on port '$service_port'..."; 
    $result = socket_connect($socket, $address, $service_port); 
    if ($result === false) { 
     echo "socket_connect() failed.\nReason: ($result) " . socket_strerror(socket_last_error($socket)) . "\n"; 
     die(); 
    } else { 
     //echo "OK.\n"; 
    } 

    $out = ''; 

    //echo "Sending HTTP HEAD request..."; 
    $result = socket_write($socket, $json, strlen($json)); 

    if ($result === false) { 
     echo "socket_connect() failed.\nReason: ($result) " . socket_strerror(socket_last_error($socket)) . "\n"; 
     die(); 
    } else { 
     //echo "OK.\n"; 
    } 



    echo socket_read($socket, 2048); 
    echo socket_read($socket, 2048); 
// 
    // while (socket_read($socket, 2048) !== '') { 
     // echo $out; 
//  
    // } 
// 
    socket_close($socket); 

답변

1

그래, 내가 뭘 기대 정확히 - 당신은 그것을 바이너리를 열고 서버가 '\ 0'로 응답하지 않으면 빈 문자열을 반환하지 않습니다) (socket_read를.

HTTP 클라이언트를 쓰려고하는 것 같습니다. 지금 중지하면 코드를 버리고 Curl 확장 프로그램에서 읽습니다. HTTP는 간단한 프로토콜이 아니며 단순한 작업이 어떻게 작동하는지 아직 많이 배워야합니다. 당신은 현재 데이터의 소켓 상태와 형식에 의존하여 데이터 흐름을 결정하고 있지만 HTTP는 어느 것도 사용하지 않습니다.

HTTP가 작동하는 방법을 배우고 싶다면 인터넷에 많은 문서가 있습니다. RFC는 필수 항목이지만 온화한 소개는 아닙니다. 귀하의 목적이 응용 프로그램을 개발하는 것이라면 curl (또는 HTTP 스트림 래퍼)을 사용하십시오.

+0

안녕하세요, 서버에서 '\ 0'을 보냈지 만 여전히 빈 문자열을 반환하지 않습니다. 또는 그냥 서버에서 ##를 보낸 다음 PHP에서 ##를 확인하여 루프를 종료하십시오. HTTP 클라이언트를 쓰려고하지 않고 말풍선을 알고 있습니다. 난 그냥 PHP는 내가 작성한 C + +의 Winsock 응용 프로그램과 통신 싶습니다. 도움 주셔서 감사합니다. – William

관련 문제