mirror of
https://github.com/janet-lang/janet
synced 2026-10-09 09:11:40 +00:00
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:
+2
-1
@@ -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
@@ -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
@@ -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")
|
||||
|
||||
Reference in New Issue
Block a user