2013-07-01 50 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