을 듣고 내 코드입니다 :PHP : 소켓은 여기에 문제
내가 다른 응용 프로그램으로 "테스트"를 보내<?php
$host = "127.0.0.1";
$portListen = 1234;
$portSend = 1240;
// create socket
$sSender = socket_create(AF_INET, SOCK_STREAM, 0);
socket_connect($sSender, $host, $portListen);
socket_write($sSender, "test", strlen ("test"));
$sListen = socket_create(AF_INET, SOCK_STREAM, 0);
socket_set_option($sListen, SOL_SOCKET, SO_REUSEADDR, 1);
socket_bind($sListen, $host, $portSend);
socket_listen($sListen,1);
$dataSock = socket_accept($sListen);
echo socket_read($dataSock, 3, PHP_NORMAL_READ);
// close sockets
socket_close($sSender);
socket_close($sListen);
?>
, 그것은 수신, 그리고 "ACK"다시 보냅니다. 문제는 단지 한 번만 할 수 있다는 것입니다. 새로 고침하면 주소가 이미 사용되는 오류가 발생합니다. 나는 php.net에 제안 된 솔루션을 시도했지만 아무 소용이 없습니다. socket_close() 전에 socket_shutdown()을 시도하면 연결된 경고가 표시되지 않고 새로 고침을하면 절대 종료되지 않습니다.
소켓이 즉시 닫히지 않는 이유는 데이터가 버퍼에 남아 있기 때문입니다. 그러나 당신이 볼 수 있듯이 나는 오직 단 하나의 연결을 듣기 위해 명시 적으로 말합니다. 게다가 나는이 스크립트에서 내 응용 프로그램과 3을 읽는 중 3 개의 문자 만 보내고 있습니다.
내가 뭘 잘못하고 있니?
편집 : 2 소켓을 사용하는 이유는 소켓을 이미 연결 한 상태에서 write()를 수신 할 수 없기 때문입니다. write()가 잘못된 인수 오류를 내면 listen()을 건너 뛰고 read()를 위해 곧바로 진행합니다.
이 작업을 수행하는 훨씬 쉬운 방법이 있습니다. 이 블로그 게시물을 확인하십시오. http://www.christophh.net/2012/07/24/php-socket-programming/ –