aboutsummaryrefslogtreecommitdiff
path: root/src/platform
diff options
context:
space:
mode:
authorGarrett D'Amore <garrett@damore.org>2025-10-25 11:43:59 -0700
committerGarrett D'Amore <garrett@damore.org>2025-10-25 20:11:51 -0700
commitcc419cf01d9c060a3bd3fc318f9b9bc9e736dae9 (patch)
tree2f26cd782a54bed35e03b451003deee5df701983 /src/platform
parentebc479a61b8f2d2f3a6d846d18debfb9022e6010 (diff)
downloadnng-cc419cf01d9c060a3bd3fc318f9b9bc9e736dae9.tar.gz
nng-cc419cf01d9c060a3bd3fc318f9b9bc9e736dae9.tar.bz2
nng-cc419cf01d9c060a3bd3fc318f9b9bc9e736dae9.zip
Add stream direct address functions for socket addresses.
This is going to be used to facilitate debugging, and eliminate some inconveniences around these things. We plan to move the pipe functions to use these directly, hopefully moving away from the pipe_getopt hack. (The transport API will need to grow these. For now this is just the streams.)
Diffstat (limited to 'src/platform')
-rw-r--r--src/platform/posix/posix_ipc.h2
-rw-r--r--src/platform/posix/posix_ipcconn.c47
-rw-r--r--src/platform/posix/posix_sockfd.c42
-rw-r--r--src/platform/posix/posix_tcp.h4
-rw-r--r--src/platform/posix/posix_tcpconn.c80
-rw-r--r--src/platform/windows/win_ipcconn.c48
-rw-r--r--src/platform/windows/win_ipclisten.c8
-rw-r--r--src/platform/windows/win_resolv.c2
-rw-r--r--src/platform/windows/win_tcp.c1
-rw-r--r--src/platform/windows/win_tcp.h46
-rw-r--r--src/platform/windows/win_tcpconn.c75
-rw-r--r--src/platform/windows/win_tcpdial.c38
-rw-r--r--src/platform/windows/win_tcplisten.c18
13 files changed, 187 insertions, 224 deletions
diff --git a/src/platform/posix/posix_ipc.h b/src/platform/posix/posix_ipc.h
index f1aa412d..7a48beaf 100644
--- a/src/platform/posix/posix_ipc.h
+++ b/src/platform/posix/posix_ipc.h
@@ -45,7 +45,7 @@ struct nni_ipc_dialer {
#endif
};
-extern int nni_posix_ipc_alloc(
+extern nng_err nni_posix_ipc_alloc(
nni_ipc_conn **, nni_sockaddr *, nni_ipc_dialer *, int);
extern void nni_posix_ipc_dialer_rele(nni_ipc_dialer *);
extern void nni_posix_ipc_dialer_cb(void *arg, unsigned events);
diff --git a/src/platform/posix/posix_ipcconn.c b/src/platform/posix/posix_ipcconn.c
index fd3cdbd8..11bd03d8 100644
--- a/src/platform/posix/posix_ipcconn.c
+++ b/src/platform/posix/posix_ipcconn.c
@@ -300,6 +300,14 @@ ipc_recv(void *arg, nni_aio *aio)
}
static nng_err
+ipc_sock_addr(void *arg, const nng_sockaddr **sap)
+{
+ ipc_conn *c = arg;
+ *sap = &c->sa;
+ return (NNG_OK);
+}
+
+static nng_err
ipc_get_peer_uid(void *arg, void *buf, size_t *szp, nni_type t)
{
ipc_conn *c = arg;
@@ -367,13 +375,6 @@ ipc_get_peer_pid(void *arg, void *buf, size_t *szp, nni_type t)
return (nni_copyout_int(id, buf, szp, t));
}
-static nng_err
-ipc_get_addr(void *arg, void *buf, size_t *szp, nni_type t)
-{
- ipc_conn *c = arg;
- return (nni_copyout_sockaddr(&c->sa, buf, szp, t));
-}
-
static void
ipc_stop(void *arg)
{
@@ -413,14 +414,6 @@ ipc_free(void *arg)
static const nni_option ipc_options[] = {
{
- .o_name = NNG_OPT_LOCADDR,
- .o_get = ipc_get_addr,
- },
- {
- .o_name = NNG_OPT_REMADDR,
- .o_get = ipc_get_addr,
- },
- {
.o_name = NNG_OPT_IPC_PEER_PID,
.o_get = ipc_get_peer_pid,
},
@@ -455,7 +448,7 @@ ipc_set(void *arg, const char *name, const void *val, size_t sz, nni_type t)
return (nni_setopt(ipc_options, name, c, val, sz, t));
}
-int
+nng_err
nni_posix_ipc_alloc(
nni_ipc_conn **cp, nni_sockaddr *sa, nni_ipc_dialer *d, int fd)
{
@@ -465,16 +458,18 @@ nni_posix_ipc_alloc(
return (NNG_ENOMEM);
}
- c->closed = false;
- c->dialer = d;
- c->stream.s_free = ipc_free;
- c->stream.s_close = ipc_close;
- c->stream.s_stop = ipc_stop;
- c->stream.s_send = ipc_send;
- c->stream.s_recv = ipc_recv;
- c->stream.s_get = ipc_get;
- c->stream.s_set = ipc_set;
- c->sa = *sa;
+ c->closed = false;
+ c->dialer = d;
+ c->stream.s_free = ipc_free;
+ c->stream.s_close = ipc_close;
+ c->stream.s_stop = ipc_stop;
+ c->stream.s_send = ipc_send;
+ c->stream.s_recv = ipc_recv;
+ c->stream.s_get = ipc_get;
+ c->stream.s_set = ipc_set;
+ c->stream.s_self_addr = ipc_sock_addr,
+ c->stream.s_peer_addr = ipc_sock_addr;
+ c->sa = *sa;
nni_mtx_init(&c->mtx);
nni_aio_list_init(&c->readq);
diff --git a/src/platform/posix/posix_sockfd.c b/src/platform/posix/posix_sockfd.c
index 6762987b..43225e7e 100644
--- a/src/platform/posix/posix_sockfd.c
+++ b/src/platform/posix/posix_sockfd.c
@@ -328,15 +328,6 @@ sfd_recv(void *arg, nni_aio *aio)
}
static nng_err
-sfd_get_addr(void *arg, void *buf, size_t *szp, nni_type t)
-{
- NNI_ARG_UNUSED(arg);
- nng_sockaddr sa;
- sa.s_family = NNG_AF_UNSPEC;
- return (nni_copyout_sockaddr(&sa, buf, szp, t));
-}
-
-static nng_err
sfd_get_peer_uid(void *arg, void *buf, size_t *szp, nni_type t)
{
nni_sfd_conn *c = arg;
@@ -406,14 +397,6 @@ sfd_get_peer_pid(void *arg, void *buf, size_t *szp, nni_type t)
static const nni_option sfd_options[] = {
{
- .o_name = NNG_OPT_LOCADDR,
- .o_get = sfd_get_addr,
- },
- {
- .o_name = NNG_OPT_REMADDR,
- .o_get = sfd_get_addr,
- },
- {
.o_name = NNG_OPT_PEER_PID,
.o_get = sfd_get_peer_pid,
},
@@ -448,6 +431,15 @@ sfd_set(void *arg, const char *name, const void *buf, size_t sz, nni_type t)
return (nni_setopt(sfd_options, name, c, buf, sz, t));
}
+static nng_err
+sfd_addr(void *arg, const nng_sockaddr **sap)
+{
+ static nng_sockaddr sa = { .s_family = NNG_AF_UNSPEC };
+ NNI_ARG_UNUSED(arg);
+ *sap = &sa;
+ return (NNG_OK);
+}
+
nng_err
nni_sfd_conn_alloc(nni_sfd_conn **cp, int fd)
{
@@ -464,13 +456,15 @@ nni_sfd_conn_alloc(nni_sfd_conn **cp, int fd)
nni_aio_list_init(&c->readq);
nni_aio_list_init(&c->writeq);
- c->stream.s_free = sfd_free;
- c->stream.s_close = sfd_close;
- c->stream.s_stop = sfd_stop;
- c->stream.s_recv = sfd_recv;
- c->stream.s_send = sfd_send;
- c->stream.s_get = sfd_get;
- c->stream.s_set = sfd_set;
+ c->stream.s_free = sfd_free;
+ c->stream.s_close = sfd_close;
+ c->stream.s_stop = sfd_stop;
+ c->stream.s_recv = sfd_recv;
+ c->stream.s_send = sfd_send;
+ c->stream.s_get = sfd_get;
+ c->stream.s_set = sfd_set;
+ c->stream.s_peer_addr = sfd_addr;
+ c->stream.s_self_addr = sfd_addr;
*cp = c;
return (NNG_OK);
diff --git a/src/platform/posix/posix_tcp.h b/src/platform/posix/posix_tcp.h
index 3b61d7da..20325841 100644
--- a/src/platform/posix/posix_tcp.h
+++ b/src/platform/posix/posix_tcp.h
@@ -1,5 +1,5 @@
//
-// Copyright 2024 Staysail Systems, Inc. <info@staysail.tech>
+// Copyright 2025 Staysail Systems, Inc. <info@staysail.tech>
// Copyright 2018 Capitar IT Group BV <info@capitar.com>
// Copyright 2018 Devolutions <info@devolutions.net>
//
@@ -26,6 +26,8 @@ struct nni_tcp_conn {
nni_aio *dial_aio;
nni_tcp_dialer *dialer;
nni_reap_node reap;
+ nng_sockaddr peer;
+ nng_sockaddr self;
};
extern int nni_posix_tcp_alloc(nni_tcp_conn **, nni_tcp_dialer *, int);
diff --git a/src/platform/posix/posix_tcpconn.c b/src/platform/posix/posix_tcpconn.c
index 674e3f46..43dfb4e4 100644
--- a/src/platform/posix/posix_tcpconn.c
+++ b/src/platform/posix/posix_tcpconn.c
@@ -333,41 +333,19 @@ tcp_recv(void *arg, nni_aio *aio)
}
static nng_err
-tcp_get_peername(void *arg, void *buf, size_t *szp, nni_type t)
+tcp_get_peer_addr(void *arg, const nng_sockaddr **addr)
{
- nni_tcp_conn *c = arg;
- struct sockaddr_storage ss;
- socklen_t len = sizeof(ss);
- int fd = nni_posix_pfd_fd(&c->pfd);
- nng_err rv;
- nng_sockaddr sa;
-
- if (getpeername(fd, (void *) &ss, &len) != 0) {
- return (nni_plat_errno(errno));
- }
- if ((rv = nni_posix_sockaddr2nn(&sa, &ss, len)) == NNG_OK) {
- rv = nni_copyout_sockaddr(&sa, buf, szp, t);
- }
- return (rv);
+ nni_tcp_conn *c = arg;
+ *addr = &c->peer;
+ return (NNG_OK);
}
static nng_err
-tcp_get_sockname(void *arg, void *buf, size_t *szp, nni_type t)
+tcp_get_self_addr(void *arg, const nng_sockaddr **addr)
{
- nni_tcp_conn *c = arg;
- struct sockaddr_storage ss;
- socklen_t len = sizeof(ss);
- int fd = nni_posix_pfd_fd(&c->pfd);
- int rv;
- nng_sockaddr sa;
-
- if (getsockname(fd, (void *) &ss, &len) != 0) {
- return (nni_plat_errno(errno));
- }
- if ((rv = nni_posix_sockaddr2nn(&sa, &ss, len)) == NNG_OK) {
- rv = nni_copyout_sockaddr(&sa, buf, szp, t);
- }
- return (rv);
+ nni_tcp_conn *c = arg;
+ *addr = &c->self;
+ return (NNG_OK);
}
static nng_err
@@ -402,14 +380,6 @@ tcp_get_keepalive(void *arg, void *buf, size_t *szp, nni_type t)
static const nni_option tcp_options[] = {
{
- .o_name = NNG_OPT_REMADDR,
- .o_get = tcp_get_peername,
- },
- {
- .o_name = NNG_OPT_LOCADDR,
- .o_get = tcp_get_sockname,
- },
- {
.o_name = NNG_OPT_TCP_NODELAY,
.o_get = tcp_get_nodelay,
},
@@ -452,13 +422,15 @@ nni_posix_tcp_alloc(nni_tcp_conn **cp, nni_tcp_dialer *d, int fd)
nni_aio_list_init(&c->writeq);
nni_posix_pfd_init(&c->pfd, fd, tcp_cb, c);
- c->stream.s_free = tcp_free;
- c->stream.s_stop = tcp_stop;
- c->stream.s_close = tcp_close;
- c->stream.s_recv = tcp_recv;
- c->stream.s_send = tcp_send;
- c->stream.s_get = tcp_get;
- c->stream.s_set = tcp_set;
+ c->stream.s_free = tcp_free;
+ c->stream.s_stop = tcp_stop;
+ c->stream.s_close = tcp_close;
+ c->stream.s_recv = tcp_recv;
+ c->stream.s_send = tcp_send;
+ c->stream.s_get = tcp_get;
+ c->stream.s_set = tcp_set;
+ c->stream.s_peer_addr = tcp_get_peer_addr;
+ c->stream.s_self_addr = tcp_get_self_addr;
*cp = c;
return (0);
@@ -467,9 +439,19 @@ nni_posix_tcp_alloc(nni_tcp_conn **cp, nni_tcp_dialer *d, int fd)
void
nni_posix_tcp_start(nni_tcp_conn *c, int nodelay, int keepalive)
{
+ int fd = nni_posix_pfd_fd(&c->pfd);
// Configure the initial socket options.
- (void) setsockopt(nni_posix_pfd_fd(&c->pfd), IPPROTO_TCP, TCP_NODELAY,
- &nodelay, sizeof(int));
- (void) setsockopt(nni_posix_pfd_fd(&c->pfd), SOL_SOCKET, SO_KEEPALIVE,
- &keepalive, sizeof(int));
+ (void) setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, &nodelay, sizeof(int));
+ (void) setsockopt(
+ fd, SOL_SOCKET, SO_KEEPALIVE, &keepalive, sizeof(int));
+
+ struct sockaddr_storage ss;
+ socklen_t len = sizeof(ss);
+
+ // Get this info now so we can avoid system calls later.
+ (void) getpeername(fd, (void *) &ss, &len);
+ nni_posix_sockaddr2nn(&c->peer, &ss, len);
+
+ (void) getsockname(fd, (void *) &ss, &len);
+ nni_posix_sockaddr2nn(&c->self, &ss, len);
}
diff --git a/src/platform/windows/win_ipcconn.c b/src/platform/windows/win_ipcconn.c
index 45235387..a5ef16a6 100644
--- a/src/platform/windows/win_ipcconn.c
+++ b/src/platform/windows/win_ipcconn.c
@@ -9,8 +9,8 @@
// found online at https://opensource.org/licenses/MIT.
//
-#include "core/aio.h"
-#include "core/nng_impl.h"
+#include "../../core/nng_impl.h"
+#include "win_impl.h"
#include "win_ipc.h"
@@ -276,7 +276,7 @@ ipc_send_cb(nni_win_io *io, int rv, size_t num)
}
static void
-ipc_send_cancel(nni_aio *aio, void *arg, int rv)
+ipc_send_cancel(nni_aio *aio, void *arg, nng_err rv)
{
ipc_conn *c = arg;
nni_mtx_lock(&c->mtx);
@@ -388,12 +388,6 @@ ipc_free(void *arg)
}
static nng_err
-ipc_conn_get_addr(void *c, void *buf, size_t *szp, nni_opt_type t)
-{
- return (nni_copyout_sockaddr(&(CONN(c))->sa, buf, szp, t));
-}
-
-static nng_err
ipc_conn_get_peer_pid(void *c, void *buf, size_t *szp, nni_opt_type t)
{
ULONG id;
@@ -415,14 +409,6 @@ ipc_conn_get_peer_pid(void *c, void *buf, size_t *szp, nni_opt_type t)
static const nni_option ipc_conn_options[] = {
{
- .o_name = NNG_OPT_LOCADDR,
- .o_get = ipc_conn_get_addr,
- },
- {
- .o_name = NNG_OPT_REMADDR,
- .o_get = ipc_conn_get_addr,
- },
- {
.o_name = NNG_OPT_IPC_PEER_PID,
.o_get = ipc_conn_get_peer_pid,
},
@@ -445,6 +431,14 @@ ipc_get(void *arg, const char *nm, void *val, size_t *szp, nni_opt_type t)
return (nni_getopt(ipc_conn_options, nm, c, val, szp, t));
}
+static nng_err
+ipc_addr(void *arg, const nng_sockaddr **sap)
+{
+ ipc_conn *c = arg;
+ *sap = &c->sa;
+ return (NNG_OK);
+}
+
int
nni_win_ipc_init(
nng_stream **connp, HANDLE p, const nng_sockaddr *sa, bool dialer)
@@ -459,15 +453,17 @@ nni_win_ipc_init(
nni_cv_init(&c->cv, &c->mtx);
nni_aio_list_init(&c->recv_aios);
nni_aio_list_init(&c->send_aios);
- c->dialer = dialer;
- c->sa = *sa;
- c->stream.s_free = ipc_free;
- c->stream.s_close = ipc_close;
- c->stream.s_stop = ipc_stop;
- c->stream.s_send = ipc_send;
- c->stream.s_recv = ipc_recv;
- c->stream.s_get = ipc_get;
- c->stream.s_set = ipc_set;
+ c->dialer = dialer;
+ c->sa = *sa;
+ c->stream.s_free = ipc_free;
+ c->stream.s_close = ipc_close;
+ c->stream.s_stop = ipc_stop;
+ c->stream.s_send = ipc_send;
+ c->stream.s_recv = ipc_recv;
+ c->stream.s_get = ipc_get;
+ c->stream.s_set = ipc_set;
+ c->stream.s_self_addr = ipc_addr;
+ c->stream.s_peer_addr = ipc_addr;
nni_win_io_init(&c->recv_io, ipc_recv_cb, c);
nni_win_io_init(&c->send_io, ipc_send_cb, c);
diff --git a/src/platform/windows/win_ipclisten.c b/src/platform/windows/win_ipclisten.c
index 3bb71c7d..07c69507 100644
--- a/src/platform/windows/win_ipclisten.c
+++ b/src/platform/windows/win_ipclisten.c
@@ -9,7 +9,7 @@
// found online at https://opensource.org/licenses/MIT.
//
-#include "core/nng_impl.h"
+#include "../../core/nng_impl.h"
#include "win_ipc.h"
@@ -158,7 +158,7 @@ ipc_listener_set_sec_desc(void *arg, void *desc)
return (NNG_OK);
}
-static int
+static nng_err
ipc_listener_get_addr(void *arg, void *buf, size_t *szp, nni_type t)
{
ipc_listener *l = arg;
@@ -175,7 +175,7 @@ static const nni_option ipc_listener_options[] = {
},
};
-static int
+static nng_err
ipc_listener_set(
void *arg, const char *name, const void *buf, size_t sz, nni_type t)
{
@@ -183,7 +183,7 @@ ipc_listener_set(
return (nni_setopt(ipc_listener_options, name, l, buf, sz, t));
}
-static int
+static nng_err
ipc_listener_get(
void *arg, const char *name, void *buf, size_t *szp, nni_type t)
{
diff --git a/src/platform/windows/win_resolv.c b/src/platform/windows/win_resolv.c
index 50b030da..3ccbf982 100644
--- a/src/platform/windows/win_resolv.c
+++ b/src/platform/windows/win_resolv.c
@@ -31,7 +31,7 @@ static nni_mtx resolv_mtx;
static nni_cv resolv_cv;
static void
-resolv_cancel(nni_aio *aio, void *arg, int rv)
+resolv_cancel(nni_aio *aio, void *arg, nng_err rv)
{
nni_resolv_item *item = arg;
diff --git a/src/platform/windows/win_tcp.c b/src/platform/windows/win_tcp.c
index 42667dea..006c99e8 100644
--- a/src/platform/windows/win_tcp.c
+++ b/src/platform/windows/win_tcp.c
@@ -12,7 +12,6 @@
#ifdef NNG_PLATFORM_WINDOWS
-#include <malloc.h>
#include <stdio.h>
static LPFN_ACCEPTEX acceptex;
diff --git a/src/platform/windows/win_tcp.h b/src/platform/windows/win_tcp.h
index ec8ab80c..698160b2 100644
--- a/src/platform/windows/win_tcp.h
+++ b/src/platform/windows/win_tcp.h
@@ -1,5 +1,5 @@
//
-// Copyright 2024 Staysail Systems, Inc. <info@staysail.tech>
+// Copyright 2025 Staysail Systems, Inc. <info@staysail.tech>
// Copyright 2018 Capitar IT Group BV <info@capitar.com>
// Copyright 2019 Devolutions <info@devolutions.net>
//
@@ -14,30 +14,30 @@
// This header file is private to the TCP support for Windows.
-#include "core/nng_impl.h"
+#include "../../core/nng_impl.h"
struct nni_tcp_conn {
- nng_stream ops;
- SOCKET s;
- nni_win_io recv_io;
- nni_win_io send_io;
- nni_win_io conn_io;
- nni_list recv_aios;
- nni_list send_aios;
- nni_aio *conn_aio;
- SOCKADDR_STORAGE sockname;
- SOCKADDR_STORAGE peername;
- nni_tcp_dialer *dialer;
- void *listener;
- int recv_rv;
- int send_rv;
- int conn_rv;
- bool closed;
- char buf[512]; // to hold acceptex results
- bool sending;
- bool recving;
- nni_mtx mtx;
- nni_cv cv;
+ nng_stream ops;
+ SOCKET s;
+ nni_win_io recv_io;
+ nni_win_io send_io;
+ nni_win_io conn_io;
+ nni_list recv_aios;
+ nni_list send_aios;
+ nni_aio *conn_aio;
+ nng_sockaddr sockname;
+ nng_sockaddr peername;
+ nni_tcp_dialer *dialer;
+ void *listener;
+ int recv_rv;
+ int send_rv;
+ int conn_rv;
+ bool closed;
+ char buf[512]; // to hold acceptex results
+ bool sending;
+ bool recving;
+ nni_mtx mtx;
+ nni_cv cv;
};
extern int nni_win_tcp_init(nni_tcp_conn **, SOCKET);
diff --git a/src/platform/windows/win_tcpconn.c b/src/platform/windows/win_tcpconn.c
index 102700ec..dae6b58d 100644
--- a/src/platform/windows/win_tcpconn.c
+++ b/src/platform/windows/win_tcpconn.c
@@ -9,11 +9,10 @@
// found online at https://opensource.org/licenses/MIT.
//
-#include "core/nng_impl.h"
+#include "../../core/nng_impl.h"
#include "win_tcp.h"
-#include <malloc.h>
#include <stdio.h>
static void
@@ -180,7 +179,7 @@ tcp_send_start(nni_tcp_conn *c)
}
static void
-tcp_send_cancel(nni_aio *aio, void *arg, int rv)
+tcp_send_cancel(nni_aio *aio, void *arg, nng_err rv)
{
nni_tcp_conn *c = arg;
nni_mtx_lock(&c->mtx);
@@ -263,30 +262,6 @@ tcp_close(void *arg)
}
static nng_err
-tcp_get_peername(void *arg, void *buf, size_t *szp, nni_type t)
-{
- nni_tcp_conn *c = arg;
- nng_sockaddr sa;
-
- if (nni_win_sockaddr2nn(&sa, &c->peername, sizeof(c->peername)) < 0) {
- return (NNG_EADDRINVAL);
- }
- return (nni_copyout_sockaddr(&sa, buf, szp, t));
-}
-
-static nng_err
-tcp_get_sockname(void *arg, void *buf, size_t *szp, nni_type t)
-{
- nni_tcp_conn *c = arg;
- nng_sockaddr sa;
-
- if (nni_win_sockaddr2nn(&sa, &c->sockname, sizeof(c->sockname)) < 0) {
- return (NNG_EADDRINVAL);
- }
- return (nni_copyout_sockaddr(&sa, buf, szp, t));
-}
-
-static nng_err
tcp_get_nodelay(void *arg, void *buf, size_t *szp, nni_type t)
{
nni_tcp_conn *c = arg;
@@ -314,16 +289,24 @@ tcp_get_keepalive(void *arg, void *buf, size_t *szp, nni_type t)
return (nni_copyout_bool(b, buf, szp, t));
}
+static nng_err
+tcp_self_addr(void *arg, const nng_sockaddr **sap)
+{
+ nni_tcp_conn *c = arg;
+ *sap = &c->sockname;
+ return (NNG_OK);
+}
+
+static nng_err
+tcp_peer_addr(void *arg, const nng_sockaddr **sap)
+{
+ nni_tcp_conn *c = arg;
+ *sap = &c->peername;
+ return (NNG_OK);
+}
+
static const nni_option tcp_options[] = {
{
- .o_name = NNG_OPT_REMADDR,
- .o_get = tcp_get_peername,
- },
- {
- .o_name = NNG_OPT_LOCADDR,
- .o_get = tcp_get_sockname,
- },
- {
.o_name = NNG_OPT_TCP_NODELAY,
.o_get = tcp_get_nodelay,
},
@@ -336,14 +319,14 @@ static const nni_option tcp_options[] = {
},
};
-static int
+static nng_err
tcp_get(void *arg, const char *name, void *buf, size_t *szp, nni_type t)
{
nni_tcp_conn *c = arg;
return (nni_getopt(tcp_options, name, c, buf, szp, t));
}
-static int
+static nng_err
tcp_set(void *arg, const char *name, const void *buf, size_t sz, nni_type t)
{
nni_tcp_conn *c = arg;
@@ -397,14 +380,16 @@ nni_win_tcp_init(nni_tcp_conn **connp, SOCKET s)
nni_cv_init(&c->cv, &c->mtx);
nni_aio_list_init(&c->recv_aios);
nni_aio_list_init(&c->send_aios);
- c->conn_aio = NULL;
- c->ops.s_close = tcp_close;
- c->ops.s_stop = tcp_stop;
- c->ops.s_free = tcp_free;
- c->ops.s_send = tcp_send;
- c->ops.s_recv = tcp_recv;
- c->ops.s_get = tcp_get;
- c->ops.s_set = tcp_set;
+ c->conn_aio = NULL;
+ c->ops.s_close = tcp_close;
+ c->ops.s_stop = tcp_stop;
+ c->ops.s_free = tcp_free;
+ c->ops.s_send = tcp_send;
+ c->ops.s_recv = tcp_recv;
+ c->ops.s_get = tcp_get;
+ c->ops.s_set = tcp_set;
+ c->ops.s_peer_addr = tcp_peer_addr;
+ c->ops.s_self_addr = tcp_self_addr;
nni_win_io_init(&c->recv_io, tcp_recv_cb, c);
nni_win_io_init(&c->send_io, tcp_send_cb, c);
diff --git a/src/platform/windows/win_tcpdial.c b/src/platform/windows/win_tcpdial.c
index 72e4f8a7..a3d64869 100644
--- a/src/platform/windows/win_tcpdial.c
+++ b/src/platform/windows/win_tcpdial.c
@@ -9,11 +9,10 @@
// found online at https://opensource.org/licenses/MIT.
//
-#include "core/nng_impl.h"
+#include "../../core/nng_impl.h"
#include "win_tcp.h"
-#include <malloc.h>
#include <stdio.h>
struct nni_tcp_dialer {
@@ -145,8 +144,9 @@ tcp_dial_cb(nni_win_io *io, int rv, size_t cnt)
nng_stream_free(&c->ops);
nni_aio_finish_error(aio, rv);
} else {
- DWORD yes = 1;
- int len;
+ DWORD yes = 1;
+ int len;
+ SOCKADDR_STORAGE sa;
(void) setsockopt(c->s, SOL_SOCKET, SO_UPDATE_CONNECT_CONTEXT,
(char *) &yes, sizeof(yes));
@@ -157,8 +157,13 @@ tcp_dial_cb(nni_win_io *io, int rv, size_t cnt)
(void) setsockopt(
c->s, IPPROTO_TCP, TCP_NODELAY, (char *) &nd, sizeof(nd));
- len = sizeof(SOCKADDR_STORAGE);
- (void) getsockname(c->s, (SOCKADDR *) &c->sockname, &len);
+ len = sizeof(sa);
+ (void) getsockname(c->s, (SOCKADDR *) &sa, &len);
+ nni_win_sockaddr2nn(&c->sockname, &sa, len);
+
+ len = sizeof(sa);
+ (void) getpeername(c->s, (SOCKADDR *) &sa, &len);
+ nni_win_sockaddr2nn(&c->peername, &sa, len);
nni_aio_set_output(aio, 0, c);
nni_aio_finish(aio, 0, 0);
@@ -169,19 +174,21 @@ void
nni_tcp_dial(nni_tcp_dialer *d, const nni_sockaddr *sa, nni_aio *aio)
{
SOCKET s;
- SOCKADDR_STORAGE ss;
+ SOCKADDR_STORAGE peername;
+ SOCKADDR_STORAGE sockname;
int len;
nni_tcp_conn *c;
int rv;
nni_aio_reset(aio);
- if ((len = nni_win_nn2sockaddr(&ss, sa)) <= 0) {
+ if ((len = nni_win_nn2sockaddr(&peername, sa)) <= 0) {
nni_aio_finish_error(aio, NNG_EADDRINVAL);
return;
}
- if ((s = socket(ss.ss_family, SOCK_STREAM, 0)) == INVALID_SOCKET) {
+ if ((s = socket(peername.ss_family, SOCK_STREAM, 0)) ==
+ INVALID_SOCKET) {
nni_aio_finish_error(aio, nni_win_error(GetLastError()));
return;
}
@@ -192,8 +199,6 @@ nni_tcp_dial(nni_tcp_dialer *d, const nni_sockaddr *sa, nni_aio *aio)
return;
}
- c->peername = ss;
-
nni_win_io_init(&c->conn_io, tcp_dial_cb, c);
nni_mtx_lock(&d->mtx);
@@ -209,12 +214,13 @@ nni_tcp_dial(nni_tcp_dialer *d, const nni_sockaddr *sa, nni_aio *aio)
// same family, unless a different default was requested.
if (d->srclen != 0) {
len = (int) d->srclen;
+ memcpy(&sockname, &d->src, len);
memcpy(&c->sockname, &d->src, len);
} else {
- ZeroMemory(&c->sockname, sizeof(c->sockname));
- c->sockname.ss_family = ss.ss_family;
+ ZeroMemory(&sockname, sizeof(sockname));
+ sockname.ss_family = peername.ss_family;
}
- if (bind(s, (SOCKADDR *) &c->sockname, len) != 0) {
+ if (bind(s, (SOCKADDR *) &sockname, len) != 0) {
rv = nni_win_error(GetLastError());
nni_mtx_unlock(&d->mtx);
nng_stream_free(&c->ops);
@@ -222,6 +228,8 @@ nni_tcp_dial(nni_tcp_dialer *d, const nni_sockaddr *sa, nni_aio *aio)
return;
}
+ nni_win_sockaddr2nn(&c->sockname, &sockname, sizeof(sockname));
+
if (!nni_aio_start(aio, tcp_dial_cancel, d)) {
nni_mtx_unlock(&d->mtx);
nng_stream_free(&c->ops);
@@ -234,7 +242,7 @@ nni_tcp_dial(nni_tcp_dialer *d, const nni_sockaddr *sa, nni_aio *aio)
// dialing is concurrent.
if (!nni_win_connectex(
- s, (SOCKADDR *) &c->peername, len, &c->conn_io.olpd)) {
+ s, (SOCKADDR *) &peername, len, &c->conn_io.olpd)) {
if ((rv = GetLastError()) != ERROR_IO_PENDING) {
nni_aio_list_remove(aio);
nni_mtx_unlock(&d->mtx);
diff --git a/src/platform/windows/win_tcplisten.c b/src/platform/windows/win_tcplisten.c
index 563cbcf0..0b11104d 100644
--- a/src/platform/windows/win_tcplisten.c
+++ b/src/platform/windows/win_tcplisten.c
@@ -9,12 +9,10 @@
// found online at https://opensource.org/licenses/MIT.
//
-#include "core/nng_impl.h"
-
-#include <malloc.h>
#include <stdbool.h>
#include <stdio.h>
+#include "../../core/nng_impl.h"
#include "win_tcp.h"
typedef struct tcp_listener {
@@ -220,10 +218,12 @@ tcp_accept_cancel(nni_aio *aio, void *arg, nng_err rv)
static void
tcp_listener_accepted(tcp_listener *l)
{
- BOOL nd;
- BOOL ka;
- nni_tcp_conn *c;
- nni_aio *aio;
+ BOOL nd;
+ BOOL ka;
+ nni_tcp_conn *c;
+ nni_aio *aio;
+ SOCKADDR_STORAGE sockname;
+ SOCKADDR_STORAGE peername;
aio = nni_list_first(&l->aios);
c = l->pend_conn;
@@ -232,7 +232,9 @@ tcp_listener_accepted(tcp_listener *l)
nd = l->nodelay;
nni_aio_list_remove(aio);
- nni_win_get_acceptex_sockaddrs(c->buf, &c->sockname, &c->peername);
+ nni_win_get_acceptex_sockaddrs(c->buf, &sockname, &peername);
+ nni_win_sockaddr2nn(&c->sockname, &sockname, sizeof(sockname));
+ nni_win_sockaddr2nn(&c->peername, &peername, sizeof(peername));
(void) setsockopt(c->s, SOL_SOCKET, SO_UPDATE_ACCEPT_CONTEXT,
(char *) &l->s, sizeof(l->s));