2012-03-16 2 views
1

PHP로 코딩 된 웹 IM 클라이언트의 백엔드 용 IPC 시스템에서 일하고 있습니다. 유닉스 소켓을 구현하려고하지만 생성 된 소켓 파일을 재사용하는 데 문제가 있습니다. 다음은 소켓에서 이벤트를 수신하는 코드입니다.PHP 유닉스 소켓 파일 재사용

<?php 

$socket_file = "../tmp/sockets/test.sock"; 

$socket = socket_create(AF_UNIX, SOCK_STREAM, 0); 

socket_bind($socket, $socket_file); 
socket_listen($socket); 

socket_select($temp = array($socket), $temp = null, $temp = null, 20); 

$client = socket_accept($socket); 
socket_set_nonblock($client); 
$buffer = socket_read($client, 2048); 

echo $buffer; 

socket_close($client); 
socket_close($socket); 

이 스크립트를 처음 실행하면 소켓 파일 test.sock이 만들어지고 연결을 기다립니다. 그런 다음 보내는 스크립트를 실행할 때 :

<?php 

$socket = socket_create(AF_UNIX, SOCK_STREAM, 0); 

socket_connect($socket, "../tmp/sockets/test.sock"); 

$msg = "\nThis is a test\r\n"; 

socket_write($socket, $msg, strlen($msg)); 

socket_close($socket); 

다른 스크립트는 수신 된 메시지를 출력하고 종료합니다. 그래서이 시점까지 모든 것이 내가 기대하는대로 작동하고 있습니다. 내가

rm ~/tmp/sockets/test.sock 

는 그 다음 소켓 파일을 재현하고 잘 작동 청취 스크립트를 다시 실행 실행하면

Warning: socket_bind() [function.socket-bind]: unable to bind address [98]: Address already in use 

: 나는이 오류가 발생 청취 스크립트를 다시 실행하려고 할 때 문제입니다. 그래서 내 질문은 : 어쨌든 듣기 스크립트가 기존 소켓 파일에 다시 연결하고, 보내는 스크립트가 다른 스크립트가 연결되어 있지 않고 소켓 파일에서 수신 대기 중일 때도 소켓에 쓸 수 있습니까? 나는 유닉스 소켓의 개념에 익숙하지 않으므로 어떤 도움을 주시면 대단히 감사하겠습니다!

답변

1

socket_close()는 파일을 제거하지 않으므로 수동으로 수행해야합니다 (unlink()) 두 번째 질문에 대해서는 연결할 수는 있지만 상영되는 내용은 모두 삭제됩니다. 그냥 시도 해 봐.

5

unix(7) 매뉴얼 페이지를보십시오. 끝쪽으로는 말한다 :

Binding to a socket with a filename creates a socket in the file system that must be deleted by the caller when it is no longer needed (using `unlink(2)`). The usual UNIX close-behind semantics apply; the socket can be unlinked at any time and will be finally removed from the file system when the last reference to it is closed.

그래서 바로 서버에 socket_bind() 후 소켓 파일을 제거합니다.

+0

그래서 소켓 파일은 스크립트가 수신 대기 한 후에 삭제되어야한다는 것을 의미합니다 ... 그게 내 목표 인 내용이 없으면 다른 스크립트가 소켓 파일을 열어 쓸 수 없다는 것을 의미합니다. 나는이 소켓이 작동하지 않는 것처럼 보이기 때문에 fifo 특수 파일 (명명 된 파이프)을 대신 사용하려고합니다. –

+0

한 번 듣고, 수락 및 클라이언트 처리를 루프에 넣으면 여러 클라이언트를 처리 할 수 ​​있습니까? –

+0

@NikolaiNFetissov, socket_bind 바로 다음에 링크를 해제하려고 시도했는데 파일이 즉시 삭제되었습니다. 따라서 클라이언트는 연결할 수 없습니다. 뭐가 문제 야? – seelts