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

瞥socket 好多东西不明白

WBOY
WBOYasal
2016-06-13 12:59:32932semak imbas

看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 />
		}


我现在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 ,则这个函数将会在有所有监听对象有新连接出现后再结束。

Kenyataan:
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