2017-06-14 16:58:48 -07:00
# libzt
*Embed ZeroTier directly into your app*
***
2017-05-05 18:51:04 -07:00
2017-08-01 14:21:05 -07:00
< a href = "https://www.zerotier.com?pk_campaign=github_libzt" > < img src = "https://github.com/zerotier/ZeroTierOne/raw/master/artwork/AppIcon_87x87.png" align = "left" hspace = "20" vspace = "9" > < / a >
2017-05-05 18:51:04 -07:00
2017-08-01 14:18:21 -07:00
**ZeroTier** makes it easy to securely connect devices, servers, cloud VMs, containers, and apps everywhere and manage them at scale. Now, with **libzt** you can bake this ability directly into your app or service using your preferred language or framework. We provide a BSD socket-like API supporting `SOCK_STREAM` , `SOCK_DGRAM` , and `SOCK_RAW` to make the integration simple. There's also no longer any need for system-wide virtual interfaces. This connection is exclusive to your app and fully encrypted via the [Salsa20 ](https://en.wikipedia.org/wiki/Salsa20 ) cipher.
2017-05-05 19:12:46 -07:00
2017-05-05 19:15:30 -07:00
< hr >
2017-05-05 19:05:36 -07:00
2017-05-05 19:15:30 -07:00
[](https://webchat.freenode.net/?channels=zerotier)
2017-04-06 19:16:01 -07:00
2017-07-18 09:55:58 -07:00
Pre-Built Binaries Here: [zerotier.com/download.shtml ](https://zerotier.com/download.shtml?pk_campaign=github_libzt ).
2017-05-30 12:35:18 -07:00
2017-06-14 17:09:18 -07:00
***
2017-05-30 13:50:27 -07:00
### Example
2017-04-20 13:39:46 -07:00
```
2017-06-14 16:53:59 -07:00
#include "libzt.h"
2017-06-14 17:53:32 -07:00
char *str = "welcome to the machine"; // test msg
char *nwid = "c7cd7c9e1b0f52a2"; // network to join
2017-06-16 16:58:30 -07:00
char *path = "zt1"; // path where this node's keys and configs will be stored
char *ip = "10.8.8.42"; // host on ZeroTier network
int port = 8080; // resource's port
2017-06-14 17:53:32 -07:00
struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = inet_addr(ip);
2017-06-16 16:58:30 -07:00
addr.sin_port = hton(port);
2017-05-30 13:17:39 -07:00
2017-06-14 17:38:06 -07:00
zts_simple_start(path, nwid);
int fd = zts_socket(AF_INET, SOCK_STREAM, 0);
2017-06-14 17:15:51 -07:00
zts_connect(fd, (const struct sockaddr *)addr, sizeof(addr));
zts_write(fd, str, strlen(str));
2017-04-21 14:56:42 -07:00
zts_close(fd);
2017-04-20 13:39:46 -07:00
```
2017-06-14 17:53:32 -07:00
Bindings for various [languages ](examples )
2017-05-30 13:50:27 -07:00
2017-08-01 14:21:05 -07:00
For an example using only the [Virtual Layer 2 ](https://www.zerotier.com/manual.shtml#2_2 ), see [test/layer2.cpp ](test/layer2.cpp )
2017-08-01 14:18:21 -07:00
2017-05-30 13:50:27 -07:00
***
2017-04-20 13:39:46 -07:00
2017-06-14 17:38:06 -07:00
### Building (linux, macos, bsd, win, ios)
2017-06-14 17:15:51 -07:00
2017-07-18 11:36:18 -07:00
```
git submodule init
git submodule update
make static_lib
```
2017-07-18 11:33:04 -07:00
All targets will output to `build/` . Complete instructions [here ](BUILDING.md )
2017-05-30 13:50:27 -07:00
2017-05-30 12:35:18 -07:00
***
2017-06-14 17:38:06 -07:00
### Testing and Debugging
2017-07-25 23:40:24 -07:00
- See [TESTING.md ](TESTING.md )
### Licensing
- For a [BSD]() license, build using the `lwIP` network stack with `STACK_LWIP=1`
- For a [GPL]() license, build using the `picoTCP` network stack with `STACK_PICO=1`
Regardless of which network stack you build with, the socket API will remain the same.