я делал как-то так для создания сокета:
ob_implicit_flush();
			if( ($sock = socket_create( AF_INET, SOCK_STREAM, SOL_TCP )) === false )
			{
				self::fault(self::ERROR_SCR, $sock, __LINE__);
				exit();
			}
			socket_set_option($sock, SOL_SOCKET, SO_REUSEADDR, 1);
			self::log("сервер: сокет создан\n");
			if( socket_bind( $sock, $_SERVER['HTTP_HOST'], self::$port ) === false )
			{
				self::fault(self::ERROR_SBND, $sock, __LINE__);
				exit();
			}
			self::log("сервер: сокет привязан\n");
			if( socket_listen( $sock, 2 ) === false )
			{
				self::fault(self::ERROR_SLI, $sock, __LINE__);
				exit();
			}
			self::log("сервер: сокет слушается\n");
			session_write_close();
			socket_set_nonblock($sock);
а для подключения:
private
			function getAcceptMsg($input)
		{
			preg_match("/Sec-WebSocket-Key: (.*);/uU", $input, $temp );
			$key_acp = $temp[ 1 ];
			$key_acp = base64_encode( sha1( $key_acp . "258EAFA5-E914-47DA-95CA-C5AB0DC85B11", true ) );
			$msg = "HTTP/1.1 101 Swithing Protocols\r\n";
			$msg .= "Upgrade: websocket\r\n";
			$msg .= "Connection: Upgrade\r\n";
			$msg .= "Sec-Websocket-Accept: {$key_acp}\r\n\r\n";
			return $msg;
		}
//отвечаем браузеру
						$msg = $this->getAcceptMsg($input);
						socket_write( $msgsock, $msg, strlen( $msg ) );
						socket_set_nonblock($msgsock);