/* * read from local */ static void ss_io_handle(void *conn, int fd, void *data, int mask) { /* TODO */ struct ss_conn_ctx *conn_ptr = conn; int ret; struct conn_info remote_info; struct io_event event = { .mask = AE_READABLE, .rfileproc = ss_remote_io_handle, /* server 可读 */ .wfileproc = NULL, .para = NULL, }; switch (conn_ptr->ss_conn_state) { case OPENING: /* reply */ ret = ss_request_handle(conn_ptr, &remote_info); if (ret < 0) goto err; if (ss_conn_add_remote(conn_ptr, AE_READABLE, &remote_info, &event) == NULL) { debug_print("ss_conn_add_remote() failed: %s", strerror(errno)); goto err; } conn_ptr->ss_conn_state = CONNECTING; break; case CONNECTING: /* forwarding */ client_to_remote(conn_ptr); break; default: debug_print("unknow status: %d", conn_ptr->ss_conn_state); goto err; } return; err: debug_print("close"); ss_server_del_conn(conn_ptr->server_entry, conn_ptr); }
static void ss_io_handle(void *conn, int fd, void *data, int mask) { struct ss_conn_ctx *conn_ptr = conn; struct conn_info remote_info; struct io_event event = { .mask = AE_READABLE, .rfileproc = ss_remote_io_handle, /* server 可读 */ .wfileproc = NULL, .para = NULL, }; strncpy(remote_info.ip, remote_ip, sizeof(remote_info.ip)); remote_info.port = remote_port; switch (conn_ptr->ss_conn_state) { case OPENING: if (ss_handshake_handle(conn_ptr) < 0) return; if (ss_conn_add_remote(conn_ptr, AE_READABLE, &remote_info, &event) == NULL) { debug_print("ss_conn_add_remote() failed: %s", strerror(errno)); goto err; } conn_ptr->ss_conn_state = CONNECTING; break; case CONNECTING: case CONNECTED: /* TODO */ client_to_remote(conn_ptr); break; default: debug_print("unknow state: %d", conn_ptr->ss_conn_state); } return; err: debug_print("close"); ss_server_del_conn(conn_ptr->server_entry, conn_ptr); }