aboutsummaryrefslogtreecommitdiff
path: root/src/platform
diff options
context:
space:
mode:
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));