如何识别客户端PHP Socket?

时间:2012-09-26 19:36:47

标签: php sockets

所以我自己有一个普通的PHP套接字(来自php手册中的示例或多或少相同的代码)。我找到了一种方法来检测客户端何时断开连接(优雅与否),但我如何识别它是谁? IP地址使用已用完,因为可能有多个用户具有相同的IP。

提前致谢。

2 个答案:

答案 0 :(得分:3)

如果您考虑TCP或UDP数据包标头中提供的内容,则不会包含太多身份信息,只包括IP地址。如果您想知道客户的身份,您需要让他们发送某种独特的标识符(例如@madara评论的用户名和密码)。如果它们来自同一个IP,这意味着它们使用相同的路由器,在这种情况下,它的目的是掩盖路由器后面的设备。

要检测谁断开连接,首先需要确定谁连接。每个连接都有自己的套接字,即使它们来自同一个IP地址。在psuedo php:

// Store all active sockets in an array
$online_users = array();

// Open up a listening socket
$listener = socket_create(...);
socket_listen($listener);
$client_sock = socket_accept($listener);

// Have the client send authentication stuff after connecting and
// we'll receive it on the server side
$username = socket_read($client_sock, $len);
// Map the username to the client socket
$online_users[$username] = $client_sock;

// Continue to read or write data to/from the sockets. When a read or
// write fails, you just iterate through the array to find out who
// it was. If the socket $failed_sock failed, do as follows
foreach ($online_users as $name => $socket)
{
    if ($socket == $failed_sock)
    {
        // $name is the username of the client that disconnected
        echo $name . ' disconnected';
        // You can then broadcast to your other clients that $name
        // disconnected. You can also do your SQL query to update the
        // db here.
        // Finally remove the entry for the disconnected client
        unset($online_users[$name]);
    }
}

答案 1 :(得分:2)

从逻辑上讲,这是一个艰难的问题!这只是一个想法:

如果是聊天,如何将所有在线用户存储在包含以下列的数据库或平面文件中:

NICKNAME
IP
TIME

并创建一个功能,将检查这些并相应地更新时间让我们说每10秒。基于此,您将能够确定何时以及谁在线/离线。

------更新------

检查套接字错误? 使用get_last_error()检查错误代码。

$errorcode = socket_last_error(); 
$errormsg=socket_strerror($errorcode); 
die("Error: (".$errorcode.") ".$errormsg."\n");

取消设置用户:

if($data === FALSE) {
    socket_close($clients[$i]['socket']);
    unset($clients[$i]);
    echo 'Client disconnected!',"\r\n";
    continue;
}

从数据库中取消设置客户端。您还可以通过ID识别$ clients阵列中的确切昵称。