绑定套接字
函数bind可用于将套接字绑定到特定的地址和端口。它需要一个类似于connect函数的sockaddr_in结构。
快速示例
if(!($sock = socket_create(AF_INET, SOCK_STREAM, 0)))
{
$errorcode = socket_last_error();
$errormsg = socket_strerror($errorcode);
die("Couldn't create socket: [$errorcode] $errormsg \n");
}
echo "Socket created \n";
if( !socket_bind($sock, "127.0.0.1" , 5000) )
{
$errorcode = socket_last_error();
$errormsg = socket_strerror($errorcode);
die("Could not bind socket : [$errorcode] $errormsg \n");
}
echo "Socket bind OK \n";
现在绑定完成,是时候让套接字监听连接了。我们将套接字绑定到特定的IP地址和端口号,这样做可以确保所有发送到该端口号的传入数据都由此应用程序接收。
这表明您不能将2个套接字绑定到同一端口。当然,也有例外情况,但我们将在其他文章中探讨这一点。
绑定套接字到端口后,下一步需要做的是监听连接。为此,我们需要将套接字置于监听模式。函数socket_listen用于将套接字置于监听模式。只需在绑定后添加以下行即可。
//listen
socket_listen ($sock , 10)
函数socket_listen的第二个参数称为backlog。它控制着在程序已经忙碌时保留的等待处理的传入连接数。因此,通过指定10,这意味着如果已经有10个连接在等待处理,则第11个连接请求将被拒绝。在检查socket_accept之后,这将更清晰。
现在是接受新连接的主要部分。
接受连接
使用函数socket_accept
来实现。
if(!($sock = socket_create(AF_INET, SOCK_STREAM, 0)))
{
$errorcode = socket_last_error();
$errormsg = socket_strerror($errorcode);
die("Couldn't create socket: [$errorcode] $errormsg \n");
}
echo "Socket created \n";
if( !socket_bind($sock, "127.0.0.1" , 5000) )
{
$errorcode = socket_last_error();
$errormsg = socket_strerror($errorcode);
die("Could not bind socket : [$errorcode] $errormsg \n");
}
echo "Socket bind OK \n";
if(!socket_listen ($sock , 10))
{
$errorcode = socket_last_error();
$errormsg = socket_strerror($errorcode);
die("Could not listen on socket : [$errorcode] $errormsg \n");
}
echo "Socket listen OK \n";
echo "Waiting for incoming connections... \n";
$client = socket_accept($sock);
if(socket_getpeername($client , $address , $port))
{
echo "Client $address : $port is now connected to us.";
}
socket_close($client);
socket_close($sock);
输出
运行程序。它应该显示:
$ php /var/www/server.php
套接字已创建
套接字绑定成功
套接字监听成功
等待传入连接...
现在,此程序正在端口5000上等待传入连接。不要关闭此程序,让它保持运行状态。
现在,客户端可以连接到此端口。我们将使用telnet客户端来测试。打开终端并键入
$ telnet localhost 5000
它会立即显示
$ telnet localhost 5000
正在尝试127.0.0.1...
已连接到localhost。
转义字符为'^]'。
连接由远程主机关闭。
服务器输出将显示
客户端127.0.0.1:36689现在已连接到我们。
因此,我们可以看到客户端已连接到服务器。尝试以上步骤,直到完美运行。
注意
socket_getpeername函数用于获取通过特定套接字连接到服务器的客户端的详细信息。