Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
TCP/IP连接的PHP套接字错误_Php_Sockets_Tcp - Fatal编程技术网

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

TCP/IP连接的PHP套接字错误,php,sockets,tcp,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;

我正在尝试使用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
。这确实是您看到的错误代码吗?也许您正在检查错误的错误代码

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


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

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

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

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


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

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


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

通常用于服务器的非阻塞套接字,服务器正在等待连接,因此不要使用
socket\u connect
,而是尝试使用
socket\u listen


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

我应该指定我确实在尝试连接到服务器。thanksi应该指定我确实在尝试连接到服务器。谢谢