2011-04-22 57 views
1

我對PHP非常陌生,所以這可能很簡單。無論如何,我試圖創建一個PHP腳本(由Web客戶端激活)和本地進程(用C++編寫)之間的雙向通信。 PHP腳本應該發送一些信息給C++進程,然後等待響應。我的問題是設置這種通信的唯一方法似乎是使用socket_bind,但是當我這樣做時,它會因'地址已被使用'錯誤而失敗。有問題的套接字文件/ tmp/sock已經由連續運行的C++進程創建(它不能由PHP腳本啓動)。如果我使用socket_connect並且只是寫了一些東西給C++進程,那工作得很好;但是我需要綁定,然後才能從PHP腳本中收聽該套接字。這裏是我的代碼:從PHP腳本無法綁定到套接字

<?php 
error_reporting(E_ALL); 

/* Allow the script to hang around waiting for connections. */ 
set_time_limit(0); 

/* Turn on implicit output flushing so we see what we're getting 
* as it comes in. */ 
ob_implicit_flush(); 

//Adapted from http://www.php.net/manual/en/sockets.examples.php 

if (($sock = socket_create(AF_UNIX, SOCK_STREAM,0)) === false) 
{ 
    echo "socket_create() failed: reason: " . socket_strerror(socket_last_error()) . "\n"; 
    exit(); 
} 
if (socket_bind($sock, '/tmp/sock') === false) //Fails here 
{ 
    echo "socket_bind() failed: reason: " . socket_strerror(socket_last_error($sock)) . "\n"; 
} 
.... 

Thanks--

回答

0

事實證明,所需要的僅僅是socket_read()。我沒有意識到你可以在同一個套接字上執行這兩個操作(當它只是連接而沒有綁定時)。用戶hamishcool3在PHP socket_read有一個偉大的實用功能,用於讀取套接字直到達到特定字符(儘管它可能比標準的字節限制讀取更慢)。

2

你的C++和PHP代碼必須標記插座爲共享(SO_REUSE_ADDR)。

+0

謝謝 - 我添加socket_set_option($ sock,SOL_SOCKET,SO_REUSEADDR,1)到我的腳本中,雖然它沒有返回無效操作錯誤,但我仍然遇到同樣的問題。還有什麼我需要做的C + +(Qt)?我之前使用過QLocalSockets,沒有任何關於共享的明確信息,而且沒有問題。/tmp/sock是777,權限明智。 – 2011-04-22 13:49:10

+0

@ matt-phillips:如果你運行你的php腳本,等2分鐘,然後重新運行它會發生什麼? – 2011-04-22 13:53:12

+0

@Heandel沒有變化。 – 2011-04-22 13:59:00