2013-07-01 78 views
1

我正在嘗試使用PHP中的套接字在給定的IP和端口上建立一個簡單的TCP/IP連接。用於TCP/IP連接的PHP套接字錯誤

我收到一條錯誤消息,指出「無法阻止套接字操作無法立即完成」。以下是我的代碼:

<?php 
$address = 'myhost.com'; 
$service_port = 1234; 
$timeout = 1000; 

$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); 
socket_set_nonblock($socket); 
$error = NULL; 
$attempts = 0; 
while (!($connected = @socket_connect($socket, $address, $service_port)) && ($attempts < $timeout)) { 
    $error = socket_last_error(); 
    if ($error != SOCKET_EINPROGRESS && $error != SOCKET_EALREADY) { 
      echo socket_strerror($error) . "\n"; 
      socket_close($socket); 
      return NULL; 
    } 
    usleep(1000); 
    $attempts++; 
} 
?> 

有什麼想法嗎?我知道目標主機IP或端口沒有問題。

回答

2

您在非阻塞套接字上調用connect()connect()調用將始終需要阻止以完成其操作,並且由於您明確告訴套接字是非阻塞的,因此它會立即返回一個錯誤,告訴您它尚未完成其操作。

您在使用直接使用套接字時所使用的操作系統有一點憐憫。代碼整體看起來不錯。您將重試連接,直至獲得EINPROGRESS。那確實是你看到的錯誤代碼?也許你正在檢查錯誤的錯誤代碼?

無論如何,你的代碼在我看來就像你嘗試連接直到連接建立。您可以直接使用阻止模式來實現。

只需將套接字保留爲阻塞狀態,直到您連接它並在連接後將套接字設置爲非阻塞(假設您確實需要)。

+0

非常感謝你! – Jack

2

非阻塞套接字通常用於服務器,服務器正在等待連接,這樣,而不是使用socket_connect,請嘗試使用socket_listen代替

,如果你想建立到服務器的連接(是客戶端),然後使用約翰內斯的建議

+0

我應該指定我確實試圖連接到服務器。謝謝 – Jack