PHP socket_listen() 不工作

Posted

技术标签:

【中文标题】PHP socket_listen() 不工作【英文标题】:PHP socket_listen() not working 【发布时间】:2016-06-21 21:48:00 【问题描述】:

我正在尝试学习 php 中的 Socket 编程。我得到了一个教程。我遵循了教程中的精确代码,但我的代码返回了

无法侦听套接字 [22]:无效参数错误。

我认为这更多的是服务器错误,而不是代码本身的错误。我在 Ubuntu 中运行 XAMPP 服务器。

#!/opt/lampp/bin/php
<?php

// set some variables
$host = "127.0.0.1";
$port = 80;

// don’t timeout!
set_time_limit(0);

// create socket
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP) or die('Could not create socketn');

// bind socket to port socket_connect($socket, '/var/run/mysqld/mysqld.sock')
$result = socket_connect($socket, $host, $port) or die('Could not bind to socketn');

// start listening for connections
$result = socket_listen($socket, 3) or die('Could not set up socket listenern');

// accept incoming connections
// spawn another socket to handle communication
$spawn = socket_accept($socket) or die('Could not accept incoming connectionn');

// read client input
//$input = socket_read($spawn, 1024) or die(“Could not read inputn”);

// clean up input string
$input = "red";//trim($input);

// reverse client input and send back
$output = strrev($input) . 'n';
socket_write($spawn, $output, strlen ($output)) or die('Could not write output n');
echo ($output);

// close sockets
socket_close($spawn);
socket_close($socket);


?>

【问题讨论】:

【参考方案1】:

由于您尝试侦听端口,而不是进行传出连接,因此您的 socket_connect 应该改为 socket_bind(您的评论已经表明)

$result = socket_bind($socket, $host, $port) or die('Could not bind to socketn')

另外,您应该知道,监听低于 1024 的端口需要您以 root 身份运行脚本(不建议您进行实验),因此您可能需要更改为高于 1024 的端口才能以 root 身份运行普通用户。

【讨论】:

脚本运行没有任何错误。你期望输出回显($output)吗?要打印?该脚本没有返回任何输出,就像在无限循环中一样。 @user2267386 脚本正在等待连接到您要求它监听的端口。例如,如果您使用telnet localhost 8080(假设您使用端口 8080),您应该在 telnet 和输出到控制台中都看到输出“dern”(红色反转 +“n”)。然后脚本将退出。

以上是关于PHP socket_listen() 不工作的主要内容,如果未能解决你的问题,请参考以下文章

关于php的socket

PHP 可以异步使用套接字吗?

php socket 模型及效率问题

360搜索引擎so自动收录php改写方案——适合phpcms等cms

360搜索引擎so自动收录php改写方案——适合phpcms等cms

LINUX下PHP编译添加相应的动态扩展模块so(不需要重新编译PHP,以openssl.so为例)