This repository has been archived on 2025-09-14. You can view files and clone it, but cannot push or open issues or pull requests.
Sean Reifschneider 5f6faaa5e8 Python send() with binary data
zts_py_send() was using strlen() to determine the length of the
send(). This works fine with strings, but fails with binary
data.

To fix this, I have removed the string encoding code, and
converted to using the Buffer protocol as is done in the
Python socketmodule send() implementation. This does mean
that this send() implementation only takes byte-like objects.

The workaround for this could be at the python level rather
than the C++ level.

NOTE: This implementation has a bug in the exception handling
if a non-bytes-like object is passed. You get an exception,
but the exception is not accurate, it reports the TypeError,
but the actual raised exception is due to there being a return
value when the error indicator is set. I spent a few hours
trying to fix this but was unable to. I'm afraid I just couldn't
figure it out.

My SSH proxy was misbehaving because the second block
of data going from the client to the server had a NUL byte as
the first byte to send, so the send was returning 0 bytes
sent, but that was due to send() being told to send 0 bytes.

With this, my SSH proxy is now working, including able to run
an rsync of my boot initrd over SSH over ZeroTier entirely in
userspace.
2021-03-20 13:01:50 -06:00
2021-03-20 13:01:50 -06:00
2019-05-07 12:22:58 -07:00
2020-12-20 18:40:17 -07:00
2021-03-16 13:00:41 -07:00
2021-03-16 13:44:21 -07:00
2021-03-16 13:44:21 -07:00
2021-03-02 01:53:03 -08:00

ZeroTier SDK

zts_socket()

Peer-to-peer and cross-platform encrypted connections built right into your app or service. No drivers, no root, and no host configuration.


Examples | API Documentation | Community | Report a Bug

@zerotier r/zerotier

latest libzt version Last Commit Build Status (master branch)

Language/Platform Installation Version Example
C/C++ Build from source version C/C++
Objective-C See examples/objective-c version Objective-C
C# Install-Package ZeroTier.Sockets C#
Python pip install libzt Python
Rust Coming very soon version Rust
Swift See examples/swift version Swift
Java ./build.sh host-jar Java
Node.js See examples/nodejs Node.js
Linux Build from source version C/C++
macOS brew install libzt C/C++, Objective-C
iOS / iPadOS ./build.sh ios-framework Objective-C, Swift
Android ./build.sh android-aar Java

#include "ZeroTierSockets.h"

int main()
{
    zts_start(...)
    zts_join(networkId);
    int fd = zts_socket(ZTS_AF_INET, ZTS_SOCK_STREAM, 0);
    zts_connect(fd, ...);
    ...
}

Build from source

git submodule update --init

This project uses CMake as a build system generator. The scripts build.* simplify building and packaging for various targets. There are many targets and configurations not mentioned here.

Platform Build instructions Notes
Linux ./build.sh host "release" build.sh
macOS ./build.sh host "release" build.sh
Windows . .\build.ps1; Build-Host -BuildType "Release" build.ps1, Requires PowerShell

Using the host keyword will automatically detect the current machine type and build standard libzt for use in C/C++ (no additional language bindings.) See ./build.sh list for additional target options. libzt depends on cURL for the optional portion of the API that interfaces with our hosted web offering (my.zerotier.com). If you do not need this functionality you can omit it by passing -DZTS_ENABLE_CENTRAL_API=0 to CMake.

Example output:

~/libzt/dist/macos-x64-host-release
├── bin
│   ├── client
│   ├── server
│   └── ...
└── lib
    ├── libzt.a
    └── libzt.dylib

Important directories:

Directory Purpose
dist Contains finished targets (libraries, binaries, packages, etc.)
cache Contains build system caches that can safely be deleted after use.
pkg Contains project, script and spec files to generate packages.

Self-hosting (Optional)

We provide ways for your app or enterprise to function indepenently from any of our services if desired.

While we do operate a global network of redundant root servers, network controllers and an admin API/UI called Central, some use-cases require full control over the infrastructure and we try to make it as easy as possible to set up your own controllers and root servers: See here to learn more about how to set up your own network controller, and here to learn more about setting up your own roots.

Help

Licensing

ZeroTier and the ZeroTier SDK (libzt and libztcore) are licensed under the BSL version 1.1. ZeroTier is free to use internally in businesses and academic institutions and for non-commercial purposes. Certain types of commercial use such as building closed-source apps and devices based on ZeroTier or offering ZeroTier network controllers and network management as a SaaS service require a commercial license. A small amount of third party code is also included in ZeroTier and is not subject to our BSL license. See AUTHORS.md for a list of third party code, where it is included, and the licenses that apply to it. All of the third party code in ZeroTier is liberally licensed (MIT, BSD, Apache, public domain, etc.). If you want a commercial license to use the ZeroTier SDK in your product contact us directly via contact@zerotier.com

Description
No description provided
Readme 17 MiB
Languages
C++ 58%
C 21.6%
C# 5.8%
Java 5%
Rust 3.3%
Other 6.3%