1

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

4

2 回答 2

2

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

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

无论如何,您的代码在我看来就像您尝试连接,直到建立连接。您可以直接使用阻塞模式来实现这一点。

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

于 2013-07-01T20:45:24.470 回答
2

非阻塞套接字通常用于服务器,服务器正在等待连接,所以不要使用socket_connect,尝试socket_listen使用

如果您想建立与服务器的连接(作为客户端),请使用 Johannes 的建议

于 2013-07-01T20:49:36.503 回答