Rumah > pembangunan bahagian belakang > tutorial php > 瞥socket 好多东西不明白

瞥socket 好多东西不明白

WBOY
Lepaskan: 2016-06-13 11:05:55
asal
997 orang telah melayarinya

看socket 好多东西不明白
网上下了个html5 发socket 给php.server

php.server里面有些地方不明白呀

部分代码

		function __construct ($address, $port) {<br />			error_reporting (E_ALL);<br />			set_time_limit (0);<br />			ob_implicit_flush ();<br />			<br />			// Socket creation<br />			$this->master = socket_create (AF_INET, SOCK_STREAM, SOL_TCP) or die("socket_create() failed");<br />			socket_set_option ($this->master, SOL_SOCKET, SO_REUSEADDR, 1) or die("socket_option() failed");<br />			socket_bind ($this->master, $address, $port) or die("socket_bind() failed");<br />			socket_listen ($this->master, 20) or die("socket_listen() failed");<br />			$this->sockets[] = $this->master;<br />			$this->say ("Server Started : " . date ('Y-m-d H:i:s'));<br />			$this->say ("Listening on   : {$address} {$port}");<br />			$this->say ("Master socket  : {$this->master}\n");<br /><br />			// Main loop<br />			while (true) {<br /><br />				$changed = $this->sockets;<br />				socket_select ($changed, $write = NULL, $except = NULL, NULL);<br /><br />				foreach ($changed as $socket) {<br />					if ($socket == $this->master) {<br /><br /><br />						$client = socket_accept ($this->master);<br /><br />						if ($client < 0) {<br />							$this->log ("socket_accept() failed");<br />							continue;<br />						}<br />						else {<br />							// Connects the socket<br />							$this->connect ($client);<br />						}<br />					}<br />					else {<br /><br />						$bytes = @socket_recv ($socket, $buffer, 2048, 0);<br />						if ($bytes == 0) {<br />							// On socket.close ();<br />							$this->disconnect ($socket);<br />						}<br />						else {<br />							// Retrieve the user from his socket<br />							$user = $this->getuserbysocket ($socket);<br />							<br />							if (!$user->handshake) {<br />								$this->dohandshake ($user, $buffer);<br />							}<br />							else {<br />								$this->process ($user, $this->decode ($buffer));<br />							}<br />						}<br />					}<br />				}<br />			}<br />		}
Salin selepas log masuk


我现在linux 下运行了 server.php        php server.php
我发现
socket_select ($changed, $write = NULL, $except = NULL, NULL);的时候
就不会在往下下运行了
我在网上查了下socket_select 
地址是http://php.net/manual/en/function.socket-select.php

socket_select — Runs the select() system call on the given arrays of sockets with a specified timeout

socket_select() accepts arrays of sockets and waits for them to change status. Those coming with BSD sockets background will recognize that those socket resource arrays are in fact the so-called file descriptor sets. Three independent arrays of socket resources are watched. 

按我的理解 这个socket_select 可以监听到 sockets 数组里面的东西的状态的变化
当状态没有变化的时候 是挂起的 就是不会往下执行
这么理解对吗
------解决方案--------------------
socket_select()是等待连接全部有新动态时结束,它有个timeout参数至关重要,其中规定了它最多可以阻塞(可以理解为运行)多长时间。你传入的为 NULL ,则这个函数将会在有所有监听对象有新连接出现后再结束。

Label berkaitan:
sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan