TCP / IP连接的PHP套接字错误

时间:2013-07-01 20:41:31

标签: php sockets tcp

我正在尝试使用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或端口没有问题。

2 个答案:

答案 0 :(得分:2)

您正在非阻塞套接字上调用connect()connect()调用将始终需要阻塞以完成其操作,并且由于您明确告知套接字是非阻塞的,因此它会立即返回,并显示错误,告知您它尚未完成其操作。

在使用套接字时,您有点受到操作系统的支配。代码整体看起来不错。在获得EINPROGRESS之前,您将重试连接。这确实是你看到的错误代码吗?也许您正在检查错误的错误代码?

无论如何,你的代码看起来像你试图连接,直到建立连接。您可以直接使用阻止模式来实现这一目标。

将套接字保持为阻塞,直到连接它并在连接后将套接字设置为非阻塞(假设您确实需要)。

答案 1 :(得分:2)

非阻塞套接字通常用于服务器,服务器正在等待连接,因此请尝试使用socket_connect而不是socket_listen

如果你想与服务器建立连接(成为客户端),那么使用Johannes的建议