Files
ts-mobile-go/docs/teamspeak-sdk-3.5.2/doc/server/faq.html
T

261 lines
20 KiB
HTML
Raw Normal View History

2026-07-20 19:01:03 +08:00
<!DOCTYPE html>
<html class="writer-html5" lang="en" data-content_root="../">
<head>
<meta charset="utf-8" /><meta name="viewport" content="width=device-width, initial-scale=1" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>FAQ &mdash; TeamSpeak SDK documentation</title>
<link rel="stylesheet" type="text/css" href="../_static/pygments.css?v=b86133f3" />
<link rel="stylesheet" type="text/css" href="../_static/css/theme.css?v=9edc463e" />
<script src="../_static/jquery.js?v=5d32c60e"></script>
<script src="../_static/_sphinx_javascript_frameworks_compat.js?v=2cd50e6c"></script>
<script src="../_static/documentation_options.js?v=7f41d439"></script>
<script src="../_static/doctools.js?v=9bcbadda"></script>
<script src="../_static/sphinx_highlight.js?v=dc90522c"></script>
<script src="../_static/js/theme.js"></script>
<link rel="index" title="Index" href="../genindex.html" />
<link rel="search" title="Search" href="../search.html" />
<link rel="next" title="Introduction" href="../client/intro.html" />
<link rel="prev" title="Filetransfer" href="filetransfer.html" />
</head>
<body class="wy-body-for-nav">
<div class="wy-grid-for-nav">
<nav data-toggle="wy-nav-shift" class="wy-nav-side">
<div class="wy-side-scroll">
<div class="wy-side-nav-search" >
<a href="../index.html" class="icon icon-home">
TeamSpeak SDK
<img src="../_static/logo.png" class="logo" alt="Logo"/>
</a>
<div role="search">
<form id="rtd-search-form" class="wy-form" action="../search.html" method="get">
<input type="text" name="q" placeholder="Search docs" aria-label="Search docs" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div><div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="Navigation menu">
<p class="caption" role="heading"><span class="caption-text">API</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../errors.html">TeamSpeak Error Codes</a></li>
<li class="toctree-l1"><a class="reference internal" href="../properties.html">Property Enums</a></li>
<li class="toctree-l1"><a class="reference internal" href="../enumerations.html">Structures &amp; Enumerations</a></li>
<li class="toctree-l1"><a class="reference internal" href="../client_api.html">TeamSpeak Client Functions</a></li>
<li class="toctree-l1"><a class="reference internal" href="../server_api.html">TeamSpeak Server Functions</a></li>
</ul>
<p class="caption" role="heading"><span class="caption-text">Server</span></p>
<ul class="current">
<li class="toctree-l1"><a class="reference internal" href="intro.html">Introduction</a></li>
<li class="toctree-l1"><a class="reference internal" href="basic.html">Getting started</a></li>
<li class="toctree-l1"><a class="reference internal" href="list-items.html">List available clients, channels, servers</a></li>
<li class="toctree-l1"><a class="reference internal" href="vserver-manage.html">Create and stop virtual servers</a></li>
<li class="toctree-l1"><a class="reference internal" href="advanced-create.html">Advanced virtual server creation</a></li>
<li class="toctree-l1"><a class="reference internal" href="info.html">Retrieve and store information</a></li>
<li class="toctree-l1"><a class="reference internal" href="channels.html">Managing channels</a></li>
<li class="toctree-l1"><a class="reference internal" href="clients.html">Managing clients</a></li>
<li class="toctree-l1"><a class="reference internal" href="whisper.html">Whisper lists</a></li>
<li class="toctree-l1"><a class="reference internal" href="encryption.html">Custom encryption</a></li>
<li class="toctree-l1"><a class="reference internal" href="passwords.html">Custom passwords</a></li>
<li class="toctree-l1"><a class="reference internal" href="permissions.html">Permission checks</a></li>
<li class="toctree-l1"><a class="reference internal" href="security-salt.html">Security salts and hashes</a></li>
<li class="toctree-l1"><a class="reference internal" href="disable-commands.html">Disabling protocol commands</a></li>
<li class="toctree-l1"><a class="reference internal" href="filetransfer.html">Filetransfer</a></li>
<li class="toctree-l1 current"><a class="current reference internal" href="#">FAQ</a><ul>
<li class="toctree-l2"><a class="reference internal" href="#unable-to-start-multiple-virtual-servers-processes">Unable to start multiple virtual servers / processes</a></li>
<li class="toctree-l2"><a class="reference internal" href="#configure-the-maximum-number-of-clients-on-a-server">Configure the maximum number of clients on a server</a></li>
<li class="toctree-l2"><a class="reference internal" href="#i-get-accounting-sid-1-is-running-initializing-shutdown-in-the-log">I get “Accounting | | sid=1 is running initializing shutdown” in the log</a></li>
<li class="toctree-l2"><a class="reference internal" href="#implementing-a-name-password-authentication">Implementing a name/password authentication</a></li>
</ul>
</li>
</ul>
<p class="caption" role="heading"><span class="caption-text">Client</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../client/intro.html">Introduction</a></li>
<li class="toctree-l1"><a class="reference internal" href="../client/basic.html">Getting started</a></li>
<li class="toctree-l1"><a class="reference internal" href="../client/connections.html">Managing server connections</a></li>
<li class="toctree-l1"><a class="reference internal" href="../client/logging.html">Logging</a></li>
<li class="toctree-l1"><a class="reference internal" href="../client/audio.html">Client Audio</a></li>
<li class="toctree-l1"><a class="reference internal" href="../client/wave-files.html">Playing wave files</a></li>
<li class="toctree-l1"><a class="reference internal" href="../client/3dsound.html">3D Sound</a></li>
<li class="toctree-l1"><a class="reference internal" href="../client/whisper.html">Whisper lists</a></li>
<li class="toctree-l1"><a class="reference internal" href="../client/voice-encryption.html">Channel voice data encryption</a></li>
<li class="toctree-l1"><a class="reference internal" href="../client/info.html">Retrieve and store information</a></li>
<li class="toctree-l1"><a class="reference internal" href="../client/channels.html">Channel Management</a></li>
<li class="toctree-l1"><a class="reference internal" href="../client/client-list.html">List clients</a></li>
<li class="toctree-l1"><a class="reference internal" href="../client/client-kick.html">Kicking clients</a></li>
<li class="toctree-l1"><a class="reference internal" href="../client/local-mute.html">Muting other clients</a></li>
<li class="toctree-l1"><a class="reference internal" href="../client/textmessages.html">Text chat</a></li>
<li class="toctree-l1"><a class="reference internal" href="../client/filetransfer.html">Filetransfer</a></li>
<li class="toctree-l1"><a class="reference internal" href="../client/encryption.html">Custom encryption</a></li>
<li class="toctree-l1"><a class="reference internal" href="../client/passwords.html">Custom passwords</a></li>
<li class="toctree-l1"><a class="reference internal" href="../client/faq.html">FAQ</a></li>
</ul>
</div>
</div>
</nav>
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap"><nav class="wy-nav-top" aria-label="Mobile navigation menu" >
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="../index.html">TeamSpeak SDK</a>
</nav>
<div class="wy-nav-content">
<div class="rst-content">
<div role="navigation" aria-label="Page navigation">
<ul class="wy-breadcrumbs">
<li><a href="../index.html" class="icon icon-home" aria-label="Home"></a></li>
<li class="breadcrumb-item active">FAQ</li>
<li class="wy-breadcrumbs-aside">
</li>
</ul>
<hr/>
</div>
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
<div itemprop="articleBody">
<section id="faq">
<h1>FAQ<a class="headerlink" href="#faq" title="Link to this heading"></a></h1>
<section id="unable-to-start-multiple-virtual-servers-processes">
<h2>Unable to start multiple virtual servers / processes<a class="headerlink" href="#unable-to-start-multiple-virtual-servers-processes" title="Link to this heading"></a></h2>
<p>You dont have a valid license key in the correct location. The file
<cite>licensekey.dat</cite> needs to be placed in the same directory as the
server executable.
Without a license key or an expired / invalid one the following restrictions are
in place:</p>
<ul class="simple">
<li><p>Only one server process per machine</p></li>
<li><p>Only one virtual server per process</p></li>
<li><p>Up to 32 slots</p></li>
</ul>
<p>Please contact <a class="reference external" href="mailto:sales&#37;&#52;&#48;teamspeakusa&#46;com">sales<span>&#64;</span>teamspeakusa<span>&#46;</span>com</a> for license key inquiries or to
obtain a valid license.</p>
</section>
<section id="configure-the-maximum-number-of-clients-on-a-server">
<h2>Configure the maximum number of clients on a server<a class="headerlink" href="#configure-the-maximum-number-of-clients-on-a-server" title="Link to this heading"></a></h2>
<p>The number of slots per virtual server can be changed by setting the
virtual server property <a class="reference internal" href="../properties.html#c.VirtualServerProperties.VIRTUALSERVER_MAXCLIENTS" title="VIRTUALSERVER_MAXCLIENTS"><code class="xref c c-enumerator docutils literal notranslate"><span class="pre">VIRTUALSERVER_MAXCLIENTS</span></code></a></p>
<p>Example to set 100 slots on the specified virtual server:</p>
<div class="highlight-c notranslate"><div class="highlight"><pre><span></span><span class="n">ts3server_setVirtualServerVariableAsInt</span><span class="p">(</span><span class="n">serverID</span><span class="p">,</span><span class="w"> </span><span class="n">VIRTUALSERVER_MAXCLIENTS</span><span class="p">,</span><span class="w"> </span><span class="mi">100</span><span class="p">);</span><span class="w"> </span><span class="c1">// Set value</span>
<span class="n">ts3server_flushVirtualServerVariable</span><span class="p">(</span><span class="n">serverID</span><span class="p">);</span><span class="w"> </span><span class="c1">// Flush changes</span>
</pre></div>
</div>
<div class="admonition important">
<p class="admonition-title">Important</p>
<p>Please note that you probably do not have unlimited slots allowed by
your license, so dont set this arbitrarily.</p>
</div>
</section>
<section id="i-get-accounting-sid-1-is-running-initializing-shutdown-in-the-log">
<h2>I get “Accounting | | sid=1 is running initializing shutdown” in the log<a class="headerlink" href="#i-get-accounting-sid-1-is-running-initializing-shutdown-in-the-log" title="Link to this heading"></a></h2>
<p>This error happens because you are running more than one virtual server
with the same server keypair.</p>
<p>When creating a new virtual server, a keypair must be passed to
<a class="reference internal" href="vserver-manage.html#c.ts3server_createVirtualServer" title="ts3server_createVirtualServer"><code class="xref c c-func docutils literal notranslate"><span class="pre">ts3server_createVirtualServer()</span></code></a>. It is important to store the used
keypair and reuse it when restarting this virtual server later instead
of creating a new key. See the server sample within the SDK for an example.</p>
<p>However, this problem can happen if the virtual server is started with
a stored keypair, then the entire folder including the stored keypair is
copied to another PC and also started there with the <strong>same</strong> key. In this
case the licensing server will notice the same key is used more than
once and shutdown the most recently started server which tried to steal
the identity of an already running server.</p>
<p>The fix, in the server sample case, would be to delete the keypair_*.txt
files from the copied directory before starting the second server, that
way a new key would be generated and the licensing server would see the
two servers as two valid different entities. The accounting server would
now only complain if the number of simultaneously running servers
exceeds your number of slots.</p>
<div class="admonition important">
<p class="admonition-title">Important</p>
<p>Each key pair should only be used for the same virtual server.
It must not be re-used for multiple virtual servers.</p>
<p>However it is also important to not generate a new key pair
every time you start the virtual server again.</p>
</div>
</section>
<section id="implementing-a-name-password-authentication">
<h2>Implementing a name/password authentication<a class="headerlink" href="#implementing-a-name-password-authentication" title="Link to this heading"></a></h2>
<p>Although TeamSpeak 3 offers an authentication system based on
public/private keys, an often made request is to use an additional
username / password mechanism to authenticate clients with the TeamSpeak 3
server. Here we will suggest a possibility to implement this
authentication on top of the existing public / private key mechanism.</p>
<p>When connecting to the TeamSpeak 3 server, a client might make use of
the <a class="reference internal" href="../properties.html#c.ClientProperties.CLIENT_META_DATA" title="CLIENT_META_DATA"><code class="xref c c-enumerator docutils literal notranslate"><span class="pre">CLIENT_META_DATA</span></code></a> property and fill this with a username / password
combination, to let the server validate this this data in the servers
<a class="reference internal" href="../server_api.html#c.ServerLibFunctions.onClientConnected" title="ServerLibFunctions.onClientConnected"><code class="xref c c-enumerator docutils literal notranslate"><span class="pre">ServerLibFunctions.onClientConnected</span></code></a> callback.
This callback allows to set an error value to block this clients connection.</p>
<p>The client-side code:</p>
<div class="highlight-c notranslate"><div class="highlight"><pre><span></span><span class="c1">// In the client, set CLIENT_META_DATA before connecting</span>
<span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">ts3client_setClientSelfVariableAsString</span><span class="p">(</span><span class="n">scHandlerID</span><span class="p">,</span><span class="w"> </span><span class="n">CLIENT_META_DATA</span><span class="p">,</span><span class="w"> </span><span class="s">&quot;NAME#PASSWORD&quot;</span><span class="p">)</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="n">ERROR_ok</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">printf</span><span class="p">(</span><span class="s">&quot;Failed setting client meta data</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">);</span>
<span class="w"> </span><span class="k">return</span><span class="p">;</span>
<span class="p">}</span>
<span class="c1">// Call ts3client_startConnection</span>
</pre></div>
</div>
<p>In the server implement the onClientConnected callback, which validates
the name/password meta data and refuses the connection if not validated:</p>
<div class="highlight-c notranslate"><div class="highlight"><pre><span></span><span class="linenos"> 1</span><span class="kt">void</span><span class="w"> </span><span class="nf">onClientConnected</span><span class="p">(</span><span class="n">uint64</span><span class="w"> </span><span class="n">serverID</span><span class="p">,</span><span class="w"> </span><span class="n">anyID</span><span class="w"> </span><span class="n">clientID</span><span class="p">,</span><span class="w"> </span><span class="n">uint64</span><span class="w"> </span><span class="n">channelID</span><span class="p">,</span><span class="w"> </span><span class="kt">unsigned</span><span class="w"> </span><span class="kt">int</span><span class="o">*</span><span class="w"> </span><span class="n">removeClientError</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="linenos"> 2</span><span class="w"> </span><span class="c1">// Query CLIENT_META_DATA</span>
<span class="linenos"> 3</span><span class="w"> </span><span class="kt">char</span><span class="o">*</span><span class="w"> </span><span class="n">metaData</span><span class="p">;</span>
<span class="linenos"> 4</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">ts3server_getClientVariableAsString</span><span class="p">(</span><span class="n">serverID</span><span class="p">,</span><span class="w"> </span><span class="n">clientID</span><span class="p">,</span><span class="w"> </span><span class="n">CLIENT_META_DATA</span><span class="p">,</span><span class="w"> </span><span class="o">&amp;</span><span class="n">metaData</span><span class="p">)</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="n">ERROR_ok</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="linenos"> 5</span><span class="w"> </span><span class="n">printf</span><span class="p">(</span><span class="s">&quot;Failed querying client meta data</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">);</span>
<span class="linenos"> 6</span><span class="w"> </span><span class="o">*</span><span class="n">removeClientError</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">ERROR_client_not_logged_in</span><span class="p">;</span><span class="w"> </span><span class="c1">// Block client</span>
<span class="linenos"> 7</span><span class="w"> </span><span class="k">return</span><span class="p">;</span>
<span class="linenos"> 8</span><span class="w"> </span><span class="p">}</span>
<span class="linenos"> 9</span>
<span class="linenos">10</span><span class="w"> </span><span class="c1">// Validate name/password</span>
<span class="linenos">11</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="o">!</span><span class="n">validateNamePassword</span><span class="p">(</span><span class="n">metaData</span><span class="p">))</span><span class="w"> </span><span class="p">{</span>
<span class="linenos">12</span><span class="w"> </span><span class="o">*</span><span class="n">removeClientError</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">ERROR_client_not_logged_in</span><span class="p">;</span><span class="w"> </span><span class="c1">// Block client</span>
<span class="linenos">13</span><span class="w"> </span><span class="p">}</span>
<span class="linenos">14</span><span class="w"> </span><span class="c1">// Client is allowed to connect if removeClientError is not changed (defaults is ERROR_ok)</span>
<span class="linenos">15</span><span class="w"> </span><span class="n">ts3server_freeMemory</span><span class="p">(</span><span class="n">metaData</span><span class="p">);</span><span class="w"> </span><span class="c1">// Release previously allocated memory</span>
<span class="linenos">16</span><span class="p">}</span>
</pre></div>
</div>
</section>
</section>
</div>
</div>
<footer><div class="rst-footer-buttons" role="navigation" aria-label="Footer">
<a href="filetransfer.html" class="btn btn-neutral float-left" title="Filetransfer" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left" aria-hidden="true"></span> Previous</a>
<a href="../client/intro.html" class="btn btn-neutral float-right" title="Introduction" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right" aria-hidden="true"></span></a>
</div>
<hr/>
<div role="contentinfo">
<p>&#169; Copyright 2020, TeamSpeak Systems GmbH.</p>
</div>
Built with <a href="https://www.sphinx-doc.org/">Sphinx</a> using a
<a href="https://github.com/readthedocs/sphinx_rtd_theme">theme</a>
provided by <a href="https://readthedocs.org">Read the Docs</a>.
</footer>
</div>
</div>
</section>
</div>
<script>
jQuery(function () {
SphinxRtdTheme.Navigation.enable(true);
});
</script>
</body>
</html>