【问题标题】:PHP socket: unable to connect [10048]: Only one usage of each socket address (protocol/network address/port) is normally permittedPHP 套接字:无法连接 [10048]:每个套接字地址(协议/网络地址/端口)通常只允许使用一次
【发布时间】:2017-04-23 08:24:20
【问题描述】:

我运行 server.php 然后运行 ​​client.php,在几次尝试从客户端发送到服务器后,此警告显示在 client.php 屏幕上。

警告:socket_connect():无法连接 [10048]:每个套接字地址(协议/网络地址/端口)通常只允许使用一次。在 C:\xampp\htdocs\client.php 第 32 行 Socket 连接失败!

在那之后 xampp 停止工作。

这里是 server.php

<!DOCTYPE html>
<html>
<?php
  error_reporting(0);
  set_time_limit(0);
  ob_implicit_flush();
  $host = "127.0.0.1";
  $port = 65535;
  echo "Waiting for connections... \n";
  $socket = socket_create(AF_INET, SOCK_STREAM, 0) or die("Could not create socket\n");

  $result = socket_bind($socket, $host, $port) or die("Could not bind to socket\n");

  $result = socket_listen($socket) or die("Could not set up socket listener\n");

  while(1){
    $spawn[++$i] = socket_accept($socket) or die("Could not accept incoming connection\n");
    echo "\n";
    $input = socket_read($spawn[$i],1024);
    $client = $input;

    echo $client ."\n";

    socket_close($spawn[$i]);
    echo "\n";

   }
 socket_close($socket);
?>
</html>

这是我的client.php

<!DOCTYPE html>
<html>
<body>
<form method="post" action="client.php">
<p><h4><label>Type Your Message Here:<input name = "message" size = "25" maxlength = "30" required></label></h4></p>
<input type="submit" name="sendmsg" class="btn btn-primary" value="send message"/>
</form>
<?php
$user="abc";
if(empty($_POST)){

}
elseif(isset($_POST['sendmsg'])) {
    $message =$_POST["message"];

while(1){

if($message=='q') { exit; }
$socket= socket_create(AF_INET,SOCK_STREAM,SOL_TCP);
    if($socket===false)
    {
        echo "Socket creation failed!";
    }
$result = socket_connect($socket,"127.0.0.1",65535);
if($result===false)
{
    echo "Socket connection failed!";
}
    else {
        if($message !='0'){
        socket_write($socket,"$user says --> $message",1024);
        $message='0';
        }

     }
     socket_close($socket);
}

}
?>

</body>

</html>

【问题讨论】:

    标签: php sockets


    【解决方案1】:

    您在while(1) 内不断地创建、连接和关闭套接字,它们之间的延迟最小。您可能正在使用所有可用作原始端点的端口,因为关闭套接字需要时间。

    您的意思是只在页面被POSTed 到新消息时才创建连接?

    【讨论】:

    • 一旦客户端连接到服务器,服务器需要知道谁是客户端。之后,我需要向连接到服务器的所有客户端发送消息。这是否意味着我需要在服务器和客户端之间保持连接?
    • 如果您想通过浏览器运行它,那么您可以查看 WebSockets (developer.mozilla.org/en-US/docs/Web/API/WebSockets_API) 之类的东西,它维护在浏览器和服务器上运行的 Javascript 代码之间的连接。否则你可以考虑使用长轮询(查看stackoverflow.com/questions/333664/…)。
    • 我试过使用大于 65530 的端口,它可以发送到服务器。现在我需要让服务器向连接到服务器的所有客户端发送回复。有什么解决方案吗?如果有的话会很有帮助。顺便说一句,非常感谢。 =)
    猜你喜欢
    • 1970-01-01
    • 2021-05-20
    • 2017-02-21
    • 2019-05-03
    • 2017-06-09
    • 2011-01-15
    相关资源
    最近更新 更多