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


PHP socket error for TCP/IP connection

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

您正在非阻塞套接字上调用connect()connect()调用总是需要阻塞来完成其操作,并且由于您明确告知套接字不阻塞,它会立即返回一个错误,告诉您它(尚未)完成其操作。

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

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

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

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

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