Maison >php教程 >php手册 >PHP的Socket函数参考

PHP的Socket函数参考

WBOY
WBOYoriginal
2016-06-13 10:34:461107parcourir

这些Socket函数直接跟互联网的协议进行发送信息。相对于fopensock的流来讲,他们操作在一个比较底层的级别。通常,他们都是对C 函数进行封装,并且名称都类似。如果你有使用C进行socket编程的经验,那么使用这些函数将是非常熟练的。我们这里不讨论特别详细的socket编程。
使用这些函数能够解决高层级别函数所不能解决的难题。使用这些函数能够实现类似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))          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))          print("Couldnt bind socket: " . socket_strerror(socket_last_error()) . " ");
     }
     if(($error = socket_listen($socket, 5))          print("Couldnt list on socket: " .
             socket_strerror(socket_last_error()) . " ");
     }
     while(TRUE){
         //wait for connection
         if(($accept = socket_accept($socket))              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);
     }
?>

bool socket_bind(resource socket, string address, integer port)
这个socket_bind()把一个socket资源绑定在一个地址上。这个socket必须由socket_create()函数返回的一个资源。这个地址必须是一个IP地址或者是一个保存Unix socket的路径。如果是运行在Internet上的socket,你还必须提供一个端口。
socket_clear_error(resource socket)
这个函数能够清除制定socket的错误,如果没有指定参数,那么将清除所有socket的错误。
socket_close(resource socket)
socket_close函数关闭一个socket并且清除该socket所占用的内存资源。
boolean socket_connect(resource socket, string address, integer port)
这个函数创建一个客户端到一个端口或者socket的连接。你必须提供一个由socket_create产生的socket。这个address参数必须到一个socket的路径或者是一个IP地址。如果是后者,还必须跟一个数字的端口号。
下面例子演示了使用UDP协议的连接到游戏服务器然后获取信息的过程。
socket_connect
     //create UDP socket
     if(($socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP))          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))){
         //parse data
         for($i=22; ($i+5)              $ip = ord(substr($line, $i+1, 1)) . . .
                 ord(substr($line, $i+2, 1)) . . .
                 ord(substr($line, $i+3, 1)) . . .
                 ord(substr($line, $i+4, 1));
             $port = (ord(substr($line, $i+5, 1)) * 256) +
                 ord(substr($line, $i+6, 1));
             $server[] = array(ip=>$ip, port=>$port);
         }
     }
     print("

" . count($server) . " Servers

");
     //loop over servers, getting status
     foreach($server as $s){
 &nb

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn