我正在尝试使用PHP中的套接字与给定的IP和端口建立简单的TCP / IP连接。
我收到一条错误消息“无法立即完成非阻塞套接字操作”。下面是我的代码:
<?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或端口没有问题。
答案 0 :(得分:2)
您正在非阻塞套接字上调用connect()
。 connect()
调用将始终需要阻塞以完成其操作,并且由于您明确告知套接字是非阻塞的,因此它会立即返回,并显示错误,告知您它尚未完成其操作。
在使用套接字时,您有点受到操作系统的支配。代码整体看起来不错。在获得EINPROGRESS
之前,您将重试连接。这确实是你看到的错误代码吗?也许您正在检查错误的错误代码?
无论如何,你的代码看起来像你试图连接,直到建立连接。您可以直接使用阻止模式来实现这一目标。
将套接字保持为阻塞,直到连接它并在连接后将套接字设置为非阻塞(假设您确实需要)。
答案 1 :(得分:2)
非阻塞套接字通常用于服务器,服务器正在等待连接,因此请尝试使用socket_connect
而不是socket_listen
如果你想与服务器建立连接(成为客户端),那么使用Johannes的建议