TCP/IP连接的PHP套接字错误
我正在尝试使用PHP中的套接字实现到给定IP和端口的简单TCP/IP连接 我收到一条错误消息,上面说“非阻塞套接字操作无法立即完成”。下面是我的代码: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
$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应该指定我确实在尝试连接到服务器。谢谢