mirror of
https://github.com/shadowsocks/shadowsocks-libev.git
synced 2026-10-30 13:13:44 +00:00
refine buffer
This commit is contained in:
+24
-37
@@ -135,19 +135,14 @@ static void server_recv_cb (EV_P_ ev_io *w, int revents)
|
||||
struct server *server = server_recv_ctx->server;
|
||||
struct remote *remote = server->remote;
|
||||
char *buf;
|
||||
int *buf_idx, *buf_len;
|
||||
|
||||
if (remote == NULL || !remote->send_ctx->connected)
|
||||
{
|
||||
buf = server->buf;
|
||||
buf_idx = &server->buf_idx;
|
||||
buf_len = &server->buf_len;
|
||||
buf = server->buf;
|
||||
}
|
||||
else
|
||||
{
|
||||
buf = remote->buf;
|
||||
buf_idx = &remote->buf_idx;
|
||||
buf_len = &remote->buf_len;
|
||||
buf = remote->buf;
|
||||
}
|
||||
|
||||
ssize_t r = recv(server->fd, buf, BUF_SIZE, 0);
|
||||
@@ -155,16 +150,11 @@ static void server_recv_cb (EV_P_ ev_io *w, int revents)
|
||||
if (r == 0)
|
||||
{
|
||||
// connection closed
|
||||
*buf_len = 0;
|
||||
*buf_idx = 0;
|
||||
close_and_free_remote(EV_A_ remote);
|
||||
close_and_free_server(EV_A_ server);
|
||||
if (remote != NULL)
|
||||
{
|
||||
ev_io_start(EV_A_ &remote->send_ctx->io);
|
||||
}
|
||||
return;
|
||||
}
|
||||
else if(r < 0)
|
||||
else if (r < 0)
|
||||
{
|
||||
if (errno == EAGAIN || errno == EWOULDBLOCK)
|
||||
{
|
||||
@@ -174,7 +164,7 @@ static void server_recv_cb (EV_P_ ev_io *w, int revents)
|
||||
}
|
||||
else
|
||||
{
|
||||
ERROR("server recv");
|
||||
ERROR("server_recv_cb_recv");
|
||||
close_and_free_remote(EV_A_ remote);
|
||||
close_and_free_server(EV_A_ server);
|
||||
return;
|
||||
@@ -220,7 +210,7 @@ static void server_recv_cb (EV_P_ ev_io *w, int revents)
|
||||
|
||||
if (!remote->send_ctx->connected)
|
||||
{
|
||||
if (!fast_open || remote->direct)
|
||||
if (!fast_open || remote->direct)
|
||||
{
|
||||
// connecting, wait until connected
|
||||
connect(remote->fd, remote->addr_info->ai_addr, remote->addr_info->ai_addrlen);
|
||||
@@ -234,7 +224,7 @@ static void server_recv_cb (EV_P_ ev_io *w, int revents)
|
||||
{
|
||||
#ifdef TCP_FASTOPEN
|
||||
int s = sendto(remote->fd, remote->buf, r, MSG_FASTOPEN,
|
||||
remote->addr_info->ai_addr, remote->addr_info->ai_addrlen);
|
||||
remote->addr_info->ai_addr, remote->addr_info->ai_addrlen);
|
||||
if (s == -1)
|
||||
{
|
||||
if (errno == EINPROGRESS)
|
||||
@@ -284,7 +274,7 @@ static void server_recv_cb (EV_P_ ev_io *w, int revents)
|
||||
}
|
||||
else
|
||||
{
|
||||
ERROR("send");
|
||||
ERROR("server_recv_cb_send");
|
||||
close_and_free_remote(EV_A_ remote);
|
||||
close_and_free_server(EV_A_ server);
|
||||
return;
|
||||
@@ -433,7 +423,6 @@ static void server_recv_cb (EV_P_ ev_io *w, int revents)
|
||||
if (remote == NULL)
|
||||
{
|
||||
LOGE("invalid password or cipher");
|
||||
close_and_free_remote(EV_A_ remote);
|
||||
close_and_free_server(EV_A_ server);
|
||||
return;
|
||||
}
|
||||
@@ -494,7 +483,7 @@ static void server_send_cb (EV_P_ ev_io *w, int revents)
|
||||
{
|
||||
if (errno != EAGAIN && errno != EWOULDBLOCK)
|
||||
{
|
||||
ERROR("send");
|
||||
ERROR("server_send_cb_send");
|
||||
close_and_free_remote(EV_A_ remote);
|
||||
close_and_free_server(EV_A_ server);
|
||||
}
|
||||
@@ -617,7 +606,7 @@ static void remote_recv_cb (EV_P_ ev_io *w, int revents)
|
||||
}
|
||||
else
|
||||
{
|
||||
ERROR("send");
|
||||
ERROR("remote_recv_cb_send");
|
||||
close_and_free_remote(EV_A_ remote);
|
||||
close_and_free_server(EV_A_ server);
|
||||
return;
|
||||
@@ -671,7 +660,7 @@ static void remote_send_cb (EV_P_ ev_io *w, int revents)
|
||||
{
|
||||
// has data to send
|
||||
ssize_t s = send(remote->fd, remote->buf + remote->buf_idx,
|
||||
remote->buf_len, 0);
|
||||
remote->buf_len, 0);
|
||||
if (s < 0)
|
||||
{
|
||||
if (errno != EAGAIN && errno != EWOULDBLOCK)
|
||||
@@ -714,21 +703,20 @@ struct remote* new_remote(int fd, int timeout)
|
||||
{
|
||||
struct remote *remote;
|
||||
remote = malloc(sizeof(struct remote));
|
||||
|
||||
memset(remote, 0, sizeof(struct remote));
|
||||
|
||||
remote->buf = malloc(BUF_SIZE);
|
||||
remote->recv_ctx = malloc(sizeof(struct remote_ctx));
|
||||
remote->send_ctx = malloc(sizeof(struct remote_ctx));
|
||||
remote->recv_ctx->connected = 0;
|
||||
remote->send_ctx->connected = 0;
|
||||
remote->fd = fd;
|
||||
ev_io_init(&remote->recv_ctx->io, remote_recv_cb, fd, EV_READ);
|
||||
ev_io_init(&remote->send_ctx->io, remote_send_cb, fd, EV_WRITE);
|
||||
ev_timer_init(&remote->send_ctx->watcher, remote_timeout_cb, timeout, 0);
|
||||
remote->recv_ctx->remote = remote;
|
||||
remote->recv_ctx->connected = 0;
|
||||
remote->send_ctx->remote = remote;
|
||||
remote->send_ctx->connected = 0;
|
||||
remote->buf_len = 0;
|
||||
remote->buf_idx = 0;
|
||||
remote->addr_info = NULL;
|
||||
remote->direct = 0;
|
||||
return remote;
|
||||
}
|
||||
|
||||
@@ -770,18 +758,19 @@ struct server* new_server(int fd, int method)
|
||||
{
|
||||
struct server *server;
|
||||
server = malloc(sizeof(struct server));
|
||||
|
||||
memset(server, 0, sizeof(struct server));
|
||||
|
||||
server->buf = malloc(BUF_SIZE);
|
||||
server->recv_ctx = malloc(sizeof(struct server_ctx));
|
||||
server->send_ctx = malloc(sizeof(struct server_ctx));
|
||||
server->recv_ctx->connected = 0;
|
||||
server->send_ctx->connected = 0;
|
||||
server->fd = fd;
|
||||
ev_io_init(&server->recv_ctx->io, server_recv_cb, fd, EV_READ);
|
||||
ev_io_init(&server->send_ctx->io, server_send_cb, fd, EV_WRITE);
|
||||
server->recv_ctx->server = server;
|
||||
server->recv_ctx->connected = 0;
|
||||
server->send_ctx->server = server;
|
||||
server->send_ctx->connected = 0;
|
||||
server->stage = 0;
|
||||
if (method)
|
||||
{
|
||||
server->e_ctx = malloc(sizeof(struct enc_ctx));
|
||||
@@ -794,8 +783,6 @@ struct server* new_server(int fd, int method)
|
||||
server->e_ctx = NULL;
|
||||
server->d_ctx = NULL;
|
||||
}
|
||||
server->buf_len = 0;
|
||||
server->buf_idx = 0;
|
||||
return server;
|
||||
}
|
||||
|
||||
@@ -842,8 +829,8 @@ static void close_and_free_server(EV_P_ struct server *server)
|
||||
}
|
||||
}
|
||||
|
||||
static struct remote* connect_to_remote(struct listen_ctx *listener,
|
||||
const char *host, const char *port)
|
||||
static struct remote* connect_to_remote(struct listen_ctx *listener,
|
||||
const char *host, const char *port)
|
||||
{
|
||||
int opt = 1;
|
||||
int sockfd;
|
||||
@@ -860,10 +847,10 @@ static struct remote* connect_to_remote(struct listen_ctx *listener,
|
||||
if (verbose)
|
||||
{
|
||||
LOGD("connect to server: %s:%s", listener->remote_addr[index].host,
|
||||
listener->remote_addr[index].port);
|
||||
listener->remote_addr[index].port);
|
||||
}
|
||||
err = getaddrinfo(listener->remote_addr[index].host,
|
||||
listener->remote_addr[index].port, &hints, &remote_res);
|
||||
listener->remote_addr[index].port, &hints, &remote_res);
|
||||
}
|
||||
else
|
||||
err = getaddrinfo(host, port, &hints, &remote_res);
|
||||
|
||||
Reference in New Issue
Block a user