【问题标题】:PHP socket error for TCP/IP connectionTCP/IP 连接的 PHP 套接字错误
【发布时间】:2013-06-29 02:18:19
【问题描述】:

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

【问题讨论】:

    标签: php sockets tcp


    【解决方案1】:

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

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

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 我应该指定我确实在尝试连接到服务器。谢谢
      猜你喜欢
      • 1970-01-01
      • 2010-09-15
      • 2014-04-08
      • 1970-01-01
      • 2019-06-25
      • 2015-05-15
      • 2014-12-10
      • 2011-08-31
      相关资源
      最近更新 更多