这些Socket函数直接跟互联网的协议进行发送信息。相对于fopensock的流来讲,他们操作在一个比较底层的级别。通常,他们都是对C 函数进行封装,并且名称都类似。如果你有使用C进行socket编程的经验,那么使用这些函数将是非常熟练的。我们这里不讨论特别详细的socket编程。 bool socket_bind(resource socket, string address, integer port)
使用这些函数能够解决高层级别函数所不能解决的难题。使用这些函数能够实现类似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);
}
?>
This socket_bind() binds a socket resource to an address. This socket must be a resource returned by the socket_create() function. This address must be an IP address or a path to a Unix socket. If it is a socket running on the Internet, you must also provide a port.
socket_clear_error(resource socket)
This function can clear the errors of the specified socket. If no parameters are specified, all socket errors will be cleared.
socket_close(resource socket)
The socket_close function closes a socket and clears the memory resources occupied by the socket.
boolean socket_connect(resource socket, string address, integer port)
This function creates a client connection to a port or socket. You must provide a socket generated by socket_create. The address parameter must be the path to a socket or an IP address. If it is the latter, it must also be followed by a numeric port number.
The following example demonstrates the process of connecting to the game server and obtaining information using the UDP protocol.
socket_connect
//create UDP socket
if(($socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP)) < 0){
print("Couldnt create socket: " .
socket_strerror(socket_last_error()). "
");
}
//timeout after 5 seconds
socket_set_option($socket, SOL_SOCKET,
SO_RCVTIMEO, array(sec=>5,usec=>0));
//connect to the RtCW master server
if(!socket_connect($socket, wolfmaster.idsoftware.com, 27950)){
print("Couldnt connect: " .
socket_strerror(socket_last_error()) . "
");
}
//send request for servers
socket_write($socket, "xFFxFFxFFxFFgetserversx00");
//get servers
$server = array();
while (FALSE !== ($line = @socket_read($socket, 4096))){
using ; $i += 7){
. . .
ord(substr($line, $i+3, 1)) ord(substr($line, $i+5, 1)) * 256) +
");
//loop over servers, getting status
foreach($server as $s){
&nb
http://www.bkjia.com/PHPjc/508280.html
www.bkjia.com