这些Socket函数直接跟互联网的协议进行发送信息。相对于fopensock的流来讲,他们操作在一个比较底层的级别。通常,他们都是对C 函数进行封装,并且名称都类似。如果你有使用C进行socket编程的经验,那么使用这些函数将是非常熟练的。我们这里不讨论特别详细的socket编程。 boolソケット_バインド(リソースソケット、文字列アドレス、整数ポート)
使用这些函数能够解决高层级别函数所不能解决的难题。使用这些函数能够实现类似fopen的功能,你也许有很多方法来实现socket的功能,比如在PHP中使用CLI(Command-line Interface)来实现的Internet守护进程。
resource socket_accept(resource socket)
在你的脚本服务器端中,使用socket_accept接受一个进入的连接。你必须首先产生一个socket,绑定它到一个名字,并且设置它监听一个端口。在块模式中,socket_accept将产生一个唯一接受后的连接。在非块模式中,它没有建立连接则返回false。另外,当你有了一个新的socket资源后就能够进行读写操作。
下面我们将示范一个简单的回显服务器端。它运行在CLI(命令行)下面,它在12345端口等待客户端的连接。
socket_accept
set_time_limit(0);
//create the socket
if(($socket = socket_create(AF_INET, SOCK_STREAM, 0)) < 0){
print("Couldnt create socket: " . socket_strerror(socket_last_error()) . "
");
}
//bind it to the given address and port
if(($error = socket_bind($socket, gethostbyname($_SERVER[HOSTNAME]), 12345)) < 0){
print("Couldnt bind socket: " . socket_strerror(socket_last_error()) . "
");
}
if(($error = socket_listen($socket, 5)) < 0){
print("Couldnt list on socket: " .
socket_strerror(socket_last_error()) . "
");
}
while(TRUE){
//wait for connection
if(($accept = socket_accept($socket)) < 0){
print("Error while reading: " . socket_strerror($message) . "
");
break;
}
//send welcome message
socket_write($accept, "Connection accepted
");
print(date(Y-m-d H:i:s) . " STATUS: Connection accepted
");
ob_flush();
while(TRUE){
//read line from client
if(FALSE === ($line = socket_read($accept, 1024))){
print("Couldnt read from socket: " .
socket_strerror(socket_last_error()) . "
");
break 2;
}
if(!@socket_write($accept, "ECHO: $line")){
print(date(Y-m-d H:i:s) . " STATUS: Connection interrupted
");
break;
}
print(date(Y-m-d H:i:s) . " READ: $line");
ob_flush();
}
socket_close($accept);
}
?>
このsocket_bind()は、ソケットリソースをアドレスにバインドします。このソケットは、socket_create() 関数によって返されるリソースである必要があります。このアドレスは、IP アドレスまたは Unix ソケットへのパスである必要があります。インターネット上で実行されているソケットの場合は、ポートも指定する必要があります。
socket_clear_error(リソースソケット)
この関数は、指定されたソケットのエラーをクリアできます。パラメータが指定されていない場合、すべてのソケットエラーがクリアされます。
socket_close(リソースソケット)
socket_close 関数はソケットを閉じ、ソケットが占有しているメモリリソースをクリアします。
booleanソケット_connect(リソースソケット、文字列アドレス、整数ポート)
この関数は、ポートまたはソケットへのクライアント接続を作成します。 socket_create によって生成されたソケットを提供する必要があります。 address パラメータは、ソケットまたは IP アドレスへのパスである必要があります。後者の場合は、その後に数値のポート番号を続ける必要があります。
次の例は、UDP プロトコルを使用してゲームサーバーに接続し、情報を取得するプロセスを示しています。
socket_connect
// UDP ソケットを作成(socket_last_error() ) 。
");
}
//5 秒後にタイムアウト
socket_set_option($socket, SOL_SOCKET,
SO_RCVTIMEO, array(sec=>5,usec=>0));
//RtCW マスターサーバーに接続します
if 」
");
}
//サーバーにリクエストを送信
ソケット_write($socket, "xFFxFFxFFxFFgetserversx00");
//サーバーを取得
$server = array();
while(FALSE !== ($line = @socket_read( $socket、4096))){
$line, $i+1, 1)) .
.
ord(substr($i+4, 1)); 1)); サーバー)。
");
//サーバーをループし、ステータスを取得します
foreach($server as $s){
&nb
http://www.bkjia.com/PHPjc/508280.html
www.bkjia.com
true
http://www.bkjia.com/PHPjc/508280.html
技術記事
これらのソケット関数は、インターネット プロトコルと直接通信して情報を送信します。 fopensock のストリームと比較すると、比較的低いレベルで動作します。通常、それらは C 関数をブロックします...