Use SO_UPDATE_CONNECT_CONTEXT to try fix windows errors.

Some further research also suggests that this is well know limitation of
winsock and failure to call this in combination with ConnectEx can be a
problem.

However, I cannot reproduce locally on my windows machine. Searching
suggests a timing error within the network stack - if we call net/
functions before the connect is actually setup, it will be in an invalid
state.
This commit is contained in:
Calvin Rose
2026-09-10 21:52:56 -05:00
parent ba17c47e06
commit 2ec4b0459b
3 changed files with 13 additions and 6 deletions
+2 -1
View File
@@ -2468,7 +2468,6 @@ Janet janet_ev_lasterr(void) {
msgbuf,
sizeof(msgbuf),
NULL);
if (!*msgbuf) snprintf(msgbuf, sizeof(msgbuf), "%d", code);
char *c = msgbuf;
while (*c) {
if (*c == '\n' || *c == '\r') {
@@ -2477,6 +2476,8 @@ Janet janet_ev_lasterr(void) {
}
c++;
}
size_t len = c - msgbuf;
snprintf(c, sizeof(msgbuf) - len, "(%d)", code);
return janet_cstringv(msgbuf);
}
#else
+10 -4
View File
@@ -196,6 +196,10 @@ void net_callback_connect(JanetFiber *fiber, JanetAsyncEvent event) {
return; /* This apparently indicates we haven't yet gotten a connection */
}
const int no_error = NO_ERROR;
if (r == NO_ERROR) { /* Last sockopt worked, one more */
/* Put socket in a good state instead of an empty default state. */
r = setsockopt((SOCKET)stream->handle, SOL_SOCKET, SO_UPDATE_CONNECT_CONTEXT, NULL, 0);
}
#else
int res = 0;
socklen_t size = sizeof(res);
@@ -256,9 +260,11 @@ void net_callback_accept(JanetFiber *fiber, JanetAsyncEvent event) {
return;
}
SOCKET lsock = (SOCKET) state->lstream->handle;
if (NO_ERROR != setsockopt((SOCKET) state->astream->handle, SOL_SOCKET, SO_UPDATE_ACCEPT_CONTEXT,
SOCKET asock = (SOCKET) state->astream->handle;
if (NO_ERROR != setsockopt(asock, SOL_SOCKET, SO_UPDATE_ACCEPT_CONTEXT,
(char *) &lsock, sizeof(lsock))) {
janet_cancel(fiber, janet_cstringv("failed to accept connection"));
janet_cancel(fiber, janet_cstringv("failed to accept connection (accept context)"));
janet_async_end(fiber);
return;
}
@@ -947,7 +953,7 @@ JANET_CORE_FN(cfun_net_getsockname,
janet_fixarity(argc, 1);
JanetStream *js = janet_getabstract(argv, 0, &janet_stream_type);
if (js->flags & JANET_STREAM_CLOSED) janet_panic("stream closed");
struct sockaddr_storage ss;
char ss[sizeof(struct sockaddr_storage) + 64]; /* extra space */
socklen_t slen = sizeof(ss);
memset(&ss, 0, slen);
if (getsockname((JSock)js->handle, (struct sockaddr *) &ss, &slen)) {
@@ -963,7 +969,7 @@ JANET_CORE_FN(cfun_net_getpeername,
janet_fixarity(argc, 1);
JanetStream *js = janet_getabstract(argv, 0, &janet_stream_type);
if (js->flags & JANET_STREAM_CLOSED) janet_panic("stream closed");
struct sockaddr_storage ss;
char ss[sizeof(struct sockaddr_storage) + 64]; /* extra space */
socklen_t slen = sizeof(ss);
memset(&ss, 0, slen);
if (getpeername((JSock)js->handle, (struct sockaddr *)&ss, &slen)) {
+1 -1
View File
@@ -232,7 +232,7 @@
[stream]
(defer (:close stream)
# prevent immediate close
(ev/read stream 1)
(assert (ev/read stream 1) "stream should be open")
(def [host port] (net/localname stream))
(assert (= host test-host) "localname host server")
(assert (= port (scan-number test-port)) "localname port server")