Browse Source

handle EINPROGRESS

pull/71/head v1.4.5
Max Lv 10 years ago
parent
commit
75add87313
1 changed files with 43 additions and 2 deletions
  1. 45
      src/local.c

45
src/local.c

@ -197,7 +197,27 @@ static void server_recv_cb (EV_P_ ev_io *w, int revents)
#ifdef TCP_FASTOPEN
s = sendto(remote->fd, remote->buf, r, MSG_FASTOPEN,
remote_res->ai_addr, remote_res->ai_addrlen);
if (s == -1)
{
if (errno == EINPROGRESS)
{
// in progress, wait until connected
remote->buf_len = r;
remote->buf_idx = 0;
ev_io_stop(EV_A_ &server_recv_ctx->io);
ev_io_start(EV_A_ &remote->send_ctx->io);
return;
}
else
{
ERROR("sendto");
close_and_free_remote(EV_A_ remote);
close_and_free_server(EV_A_ server);
return;
}
}
remote->send_ctx->connected = 1;
ev_timer_stop(EV_A_ &remote->send_ctx->watcher);
ev_io_start(EV_A_ &remote->recv_ctx->io);
#else
// if TCP_FASTOPEN is not defined, fast_open will always be 0
@ -576,13 +596,33 @@ static void remote_send_cb (EV_P_ ev_io *w, int revents)
struct remote *remote = remote_send_ctx->remote;
struct server *server = remote->server;
if (!remote_send_ctx->connected)
if (fast_open && !remote_send_ctx->connected)
{
struct sockaddr_storage addr;
socklen_t len = sizeof addr;
int r = getpeername(remote->fd, (struct sockaddr*)&addr, &len);
if (r == 0)
{
remote_send_ctx->connected = 1;
ev_timer_stop(EV_A_ &remote_send_ctx->watcher);
ev_io_start(EV_A_ &remote->recv_ctx->io);
}
else
{
// not connected
ERROR("getpeername");
close_and_free_remote(EV_A_ remote);
close_and_free_server(EV_A_ server);
return;
}
}
if (!remote_send_ctx->connected)
{
struct sockaddr_storage addr;
socklen_t len = sizeof addr;
int r = getpeername(remote->fd, (struct sockaddr*)&addr, &len);
if (r == 0)
{
remote_send_ctx->connected = 1;
ev_io_stop(EV_A_ &remote_send_ctx->io);
@ -849,6 +889,7 @@ static void accept_cb (EV_P_ ev_io *w, int revents)
else
{
ev_io_start(EV_A_ &server->recv_ctx->io);
ev_timer_start(EV_A_ &remote->send_ctx->watcher);
}
}

Loading…
Cancel
Save