socket_close($socket);
?>
?>
resource socket_create(integer family, integer socket_type, integer protocol)
socket_create初始化一个socket的结构。第一个参数是一个protocol family,或者域。你必须使用AF_INET来指定一个Internet连接,或者使用AF_UNIX来指定一个Unix socket连接。第二个参数是一个socket的类型,你可以从下面的表中选择。一般情况下,使用SOCK_STREAM来使用TCP协议,UDP协议使用SOCK_DGRAM。第三个参数指定为一个协议。使用SOL_TCP或SOL_UDP来分别对应TCP和UDP协议。还有一个选择是你能够使用getprotobyname函数来处理。
Socket 类型
常量 描述
SOCK_DGRAM 自动寻址数据包socket
SOCK_RAW RAW协议接口
SOCK_RDM 可靠交换消息
SOCK_SEQPACKET 顺序数据包socket
SOCK_STREAM 流socket
常量 描述
SOCK_DGRAM 自动寻址数据包socket
SOCK_RAW RAW协议接口
SOCK_RDM 可靠交换消息
SOCK_SEQPACKET 顺序数据包socket
SOCK_STREAM 流socket
resource socket_create_listen(integer port, integer backlog)
使用socket_create_listen是一种比socket_create更简单的产生一个socket进行监听。这个产生的socket将监听指定的端口,后面可选的参数backlog是设置允许最大的连接数。
boolean socket_create_pair(integer family, integer socket_type, integer protocol, array handles)
socket_create_pair函数产生一对socket连接。首先前三个参数是对一个socket_create的描述,这个handles参数是一个包含两个socket资源的数组。该函数是对C里面socketpair函数的封装。
socket_create_pair
<?php
if(!socket_create_pair(AF_UNIX, SOCK_STREAM, 0, $socket))
{
print("Couldn't make sockets!\n");
exit();
}
<?php
if(!socket_create_pair(AF_UNIX, SOCK_STREAM, 0, $socket))
{
print("Couldn't make sockets!\n");
exit();
}
$child = pcntl_fork();
if($child == -1)
{
print("Couldn't fork!\n");
exit();
}
elseif($child > 0)
{
//parent
socket_close($socket[0]);
print("Parent: waiting for message\n");
$message = socket_read($socket[1], 1024, PHP_NORMAL_READ);
print("Parent: got message--$message\n");
socket_write($socket[1], "Hello, Child Process!\n");
pcntl_waitpid($child, $status);
}
else
{
//child
socket_close($socket[1]);
socket_write($socket[0], "Hello, Parent Process!\n");
print("Child: waiting for message\n");
$message = socket_read($socket[0], 1024, PHP_NORMAL_READ);
print("Child: got message--$message\n");
exit(0);
}
?>
if($child == -1)
{
print("Couldn't fork!\n");
exit();
}
elseif($child > 0)
{
//parent
socket_close($socket[0]);
print("Parent: waiting for message\n");
$message = socket_read($socket[1], 1024, PHP_NORMAL_READ);
print("Parent: got message--$message\n");
socket_write($socket[1], "Hello, Child Process!\n");
pcntl_waitpid($child, $status);
}
else
{
//child
socket_close($socket[1]);
socket_write($socket[0], "Hello, Parent Process!\n");
print("Child: waiting for message\n");
$message = socket_read($socket[0], 1024, PHP_NORMAL_READ);
print("Child: got message--$message\n");
exit(0);
}
?>
value socket_get_option(resource socket, integer level, integer option)
socket_get_option函数返回一个下表中所列的一个添加值,你必须提供一个由socket_create产生的socket资源和一个等级。这个获取的socket级别,可以使用SOL_SOCKET来确定这个级别参数。另外,使用协议,比如象SOL_TCP来表示一个TCP协议。这些选项可能是由socket_set_option设置的。
socket_get_options
<?php
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
<?php
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
print('SO_BROADCAST: ' .
socket_get_option($socket, SOL_SOCKET,
SO_BROADCAST) . "<br>\n");
print('SO_DEBUG: ' .
socket_get_option($socket, SOL_SOCKET,
SO_DEBUG) . "<br>\n");
print('SO_DONTROUTE: ' .
socket_get_option($socket, SOL_SOCKET,
SO_DONTROUTE) . "<br>\n");
print('SO_ERROR: ' .
socket_get_option($socket, SOL_SOCKET,
SO_ERROR) . "<br>\n");
print('SO_KEEPALIVE: ' .
socket_get_option($socket, SOL_SOCKET,
SO_KEEPALIVE) . "<br>\n");
print('SO_LINGER: ' .
print_r(socket_get_option($socket, SOL_SOCKET,
SO_LINGER), TRUE) . "<br>\n");
print('SO_OOBINLINE: ' .
socket_get_option($socket, SOL_SOCKET,
SO_OOBINLINE) . "<br>\n");
print('SO_RCVBUF: ' .
socket_get_option($socket, SOL_SOCKET,
SO_RCVBUF) . "<br>\n");
print('SO_RCVLOWAT: ' .
socket_get_option($socket, SOL_SOCKET,
SO_RCVLOWAT) . "<br>\n");
print('SO_RCVTIMEO: ' .
print_r(socket_get_option($socket, SOL_SOCKET,
SO_RCVTIMEO), TRUE) . "<br>\n");
print('SO_REUSEADDR: ' .
socket_get_option($socket, SOL_SOCKET,
SO_REUSEADDR) . "<br>\n");
print('SO_SNDBUF: ' .
socket_get_option($socket, SOL_SOCKET,
SO_SNDBUF) . "<br>\n");
print('SO_SNDLOWAT: ' .
socket_get_option($socket, SOL_SOCKET,
SO_SNDLOWAT) . "<br>\n");
print('SO_SNDTIMEO: ' .
print_r(socket_get_option($socket, SOL_SOCKET,
SO_SNDTIMEO), TRUE) . "<br>\n");
print('SO_TYPE: ' .
socket_get_option($socket, SOL_SOCKET,
SO_TYPE) . "<br>\n");
?>
socket_get_option($socket, SOL_SOCKET,
SO_BROADCAST) . "<br>\n");
print('SO_DEBUG: ' .
socket_get_option($socket, SOL_SOCKET,
SO_DEBUG) . "<br>\n");
print('SO_DONTROUTE: ' .
socket_get_option($socket, SOL_SOCKET,
SO_DONTROUTE) . "<br>\n");
print('SO_ERROR: ' .
socket_get_option($socket, SOL_SOCKET,
SO_ERROR) . "<br>\n");
print('SO_KEEPALIVE: ' .
socket_get_option($socket, SOL_SOCKET,
SO_KEEPALIVE) . "<br>\n");
print('SO_LINGER: ' .
print_r(socket_get_option($socket, SOL_SOCKET,
SO_LINGER), TRUE) . "<br>\n");
print('SO_OOBINLINE: ' .
socket_get_option($socket, SOL_SOCKET,
SO_OOBINLINE) . "<br>\n");
print('SO_RCVBUF: ' .
socket_get_option($socket, SOL_SOCKET,
SO_RCVBUF) . "<br>\n");
print('SO_RCVLOWAT: ' .
socket_get_option($socket, SOL_SOCKET,
SO_RCVLOWAT) . "<br>\n");
print('SO_RCVTIMEO: ' .
print_r(socket_get_option($socket, SOL_SOCKET,
SO_RCVTIMEO), TRUE) . "<br>\n");
print('SO_REUSEADDR: ' .
socket_get_option($socket, SOL_SOCKET,
SO_REUSEADDR) . "<br>\n");
print('SO_SNDBUF: ' .
socket_get_option($socket, SOL_SOCKET,
SO_SNDBUF) . "<br>\n");
print('SO_SNDLOWAT: ' .
socket_get_option($socket, SOL_SOCKET,
SO_SNDLOWAT) . "<br>\n");
print('SO_SNDTIMEO: ' .
print_r(socket_get_option($socket, SOL_SOCKET,
SO_SNDTIMEO), TRUE) . "<br>\n");
print('SO_TYPE: ' .
socket_get_option($socket, SOL_SOCKET,
SO_TYPE) . "<br>\n");
?>
