Add IPv6 to C# ZeroTier.Sockets, Add C# selftest, Misc C API improvements

This commit is contained in:
Joseph Henry
2021-03-26 16:33:22 -07:00
parent 9cd5fdee7b
commit 6638f20003
10 changed files with 1262 additions and 818 deletions

View File

@@ -66,22 +66,44 @@ int zts_connect(int fd, const struct zts_sockaddr *addr, zts_socklen_t addrlen)
return lwip_connect(fd, (sockaddr*)addr, addrlen);
}
int zts_connect_easy(int fd, int family, char *ipstr, int port) {
int zts_connect_easy(int fd, int family, char *ipstr, int port, int timeout_ms) {
if (timeout_ms < 0) {
return ZTS_ERR_ARG;
}
if (timeout_ms == 0) {
timeout_ms = 30000; // Default
}
int div = 4; // Must be > 0, Four connection attempts per second
int n_tries = (timeout_ms / 1000) * div;
int connect_delay = 1000 / div;
int err = ZTS_ERR_SOCKET;
zts_socklen_t addrlen = 0;
struct zts_sockaddr_storage ss;
struct zts_sockaddr *sa = NULL;
if (family == ZTS_AF_INET) {
struct zts_sockaddr_in in4;
zts_socklen_t addrlen = sizeof(in4);
addrlen = sizeof(ss);
ipstr2sockaddr(
family, ipstr, port, (struct zts_sockaddr *)&in4, &addrlen);
struct zts_sockaddr *sa = (struct zts_sockaddr *)&in4;
return zts_connect(fd, sa, addrlen);
family, ipstr, port, (struct zts_sockaddr *)&ss, &addrlen);
sa = (struct zts_sockaddr *)&ss;
}
if (family == ZTS_AF_INET6) {
struct zts_sockaddr_in6 in6;
zts_socklen_t addrlen = sizeof(in6);
addrlen = sizeof(ss);
ipstr2sockaddr(
family, ipstr, port, (struct zts_sockaddr *)&in6, &addrlen);
struct zts_sockaddr *sa = (struct zts_sockaddr *)&in6;
return zts_connect(fd, sa, addrlen);
family, ipstr, port, (struct zts_sockaddr *)&ss, &addrlen);
sa = (struct zts_sockaddr *)&ss;
}
if (addrlen > 0 && sa != NULL) {
if (zts_get_blocking(fd)) {
do {
err = zts_connect(fd, sa, addrlen);
zts_delay_ms(connect_delay);
n_tries--;
}
while ((err < 0) && (zts_errno != 0) && (n_tries > 0));
}
return err;
}
return ZTS_ERR_ARG;
}
@@ -137,6 +159,34 @@ int zts_accept(int fd, struct zts_sockaddr *addr, zts_socklen_t *addrlen)
return lwip_accept(fd, (sockaddr*)addr, (socklen_t*)addrlen);
}
int zts_accept_easy(int fd, char *remoteIpStr, int len, int *port)
{
if (len != ZTS_INET6_ADDRSTRLEN) {
return ZTS_ERR_ARG;
}
char ipstr[ZTS_INET6_ADDRSTRLEN];
memset(ipstr, 0, ZTS_INET6_ADDRSTRLEN);
zts_sockaddr_storage ss;
zts_socklen_t addrlen = sizeof(ss);
int acc_fd = zts_accept(fd, (zts_sockaddr*)&ss, (zts_socklen_t*)&addrlen);
struct zts_sockaddr *sa = (struct zts_sockaddr *)&ss;
if (sa->sa_family == ZTS_AF_INET) {
struct zts_sockaddr_in *in4 = (struct zts_sockaddr_in*)sa;
zts_inet_ntop(ZTS_AF_INET, &(in4->sin_addr),
remoteIpStr, ZTS_INET_ADDRSTRLEN);
*port = ntohs(in4->sin_port);
}
if (sa->sa_family == ZTS_AF_INET6) {
struct zts_sockaddr_in6 *in6 = (struct zts_sockaddr_in6*)sa;
zts_inet_ntop(ZTS_AF_INET6, &(in6->sin6_addr),
remoteIpStr, ZTS_INET6_ADDRSTRLEN);
*port = ntohs(in6->sin6_port);
}
return acc_fd;
}
int zts_setsockopt(
int fd, int level, int optname, const void *optval,zts_socklen_t optlen)
{