2010-12-02 62 views
0

嘿傢伙,我想在PHP中做一些套接字編程。PHP插座問題

所以我運行一個插座「服務器」:

$address = '127.0.0.1'; 
$port = '9999'; 

$masterSocket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); 
socket_set_option($masterSocket, SOL_SOCKET, SO_REUSEADDR, 1); 
socket_bind($masterSocket, $address, $port); 
socket_listen($masterSocket, 5); 
$clientSocket = socket_accept($masterSocket); 

所以我打開了SSH並運行此腳本。它正在運行,沒有錯誤。

然後,我有另一種PHP腳本,嘗試連接到這一點:

$fp = fsockopen("me.com", 9999, $errno, $errstr, 30); 

fclose($fp); 

,但它給我:

Warning: fsockopen(): unable to connect to me.com:9999 (Connection refused) 

如何開始解決這一問題?

+0

爲什麼要連接到:`me.com:9999`? – Ruel 2010-12-02 03:18:15

+0

@Ruel只是一個例子 – 2010-12-02 03:28:44

+0

它看起來像你綁定到一個IP和連接到另一個這個代碼,但是你在評論中提到你連接到127.0.0.1,你可以更新的問題來反映,所以我們可以看到一切1位 – tobyodavies 2010-12-02 04:24:48

回答

0

您還沒有完成偵聽套接字序列,您需要撥打socket_accept來接受新的連接。 PHP文檔中的註釋中有一個例子。

$clients = array(); 
$socket = socket_create(AF_INET,SOCK_STREAM,SOL_TCP); 
socket_bind($socket,'127.0.0.1',$port); 
socket_listen($socket); 
socket_set_nonblock($socket); 

while(true) 
{ 
    if(($newc = socket_accept($socket)) !== false) 
    { 
     echo "Client $newc has connected\n"; 
     $clients[] = $newc; 
    } 
} 

http://php.net/manual/en/function.socket-accept.php

+0

嗨對不起,我沒有粘貼我的所有代碼。我實際上有socket_accept()調用。我複製並粘貼了ur代碼並試圖運行它,並且出現以下錯誤:Warning:socket_accept():無法接受傳入連接[11]:第18行中的/home/sbirds/public_html/socketserver.php中的資源暫時不可用 – 2010-12-02 03:22:51

0

1)檢查端口防火牆關閉。你可以用telnet來檢查這個。

2)當客戶端和服務器在同一臺計算機上時(我猜你提到SSH服務器是遠程的),看看它是否有效。 3)如果它在本地工作,並且你可以使用其他工具打到遠程端口,那麼這將是棘手的。我建議你嚎and大哭,咬牙切齒;我沒有想法。

編輯:嘿。或者你可以閱讀Steve-o的回答。牙齒磨牙仍然是一種選擇。

0

我知道你說過,「me.com」就是一個例子,但是可以肯定的是,socket_bind期待IP地址。

http://php.net/manual/en/function.socket-bind.php

address

If the socket is of the AF_INET family, the address is an IP in dotted-quad notation (e.g. 127.0.0.1).

If the socket is of the AF_UNIX family, the address is the path of a Unix-domain socket (e.g. /tmp/my.sock).

0

我知道這個問題已經很老了,但是如果有人仍然有這個問題,請確保您連接到你正在聽的SAME地址,

對於例如,如果您在127.0.0.1上收聽,而您的機器地址爲me.com,則無法連接到me.com,因此您必須在me.com上收聽。

Listening on: localhost:8088 
Can only connect via: localhost:8088 // not via me.com:8088 

Listening on: me.com:8088 
Can only connect via: me.com:8088 // not via localhost:8088