linux 网络编程程序员

ss-libev 源码解析udp篇 (2)

2017-06-23  本文已影响220人  勤奋happyfire

UDP relay的代码基本都在udprelay.c中,无论ss-local还是ss-server的代码都在一起,使用宏MODULE_LOCAL,MODULE_REMOTE等区分开。代码虽然不是很多,但是由于ss-local和ss-server以及ss-redir,ss-tunnel等夹杂在同一个函数中,不断有宏去打断读代码的思路,并且很多代码还是同时被ss-local和ss-server执行到,所以本系列分多篇去逐个分析重要的函数。先从init_udprelay开始。

int
init_udprelay(const char *server_host, const char *server_port,
#ifdef MODULE_LOCAL
              const struct sockaddr *remote_addr, const int remote_addr_len,
#ifdef MODULE_TUNNEL
              const ss_addr_t tunnel_addr,
#endif
#endif
              int mtu, crypto_t *crypto, int timeout, const char *iface)

对于ss-local,多出两个参数,即remote_addr和remote_addr_len。
这个就是要使用的ss-server的地址,通过参数传进来。而ss-server不需要指定外发地址,因为ss-server外发udp的地址是从ss udp包的addr header里面读取到的。

typedef struct server_ctx {
    ev_io io;
    int fd;
    crypto_t *crypto;
    int timeout;
    const char *iface;
    struct cache *conn_cache;
#ifdef MODULE_LOCAL
    const struct sockaddr *remote_addr;
    int remote_addr_len;
#ifdef MODULE_TUNNEL
    ss_addr_t tunnel_addr;
#endif
#endif
#ifdef MODULE_REMOTE
    struct ev_loop *loop;
#endif
} server_ctx_t;

下面列出init_udprelay的重要步骤:

struct cache *conn_cache;
    cache_create(&conn_cache, MAX_UDP_CONN_NUM, free_cb);
#ifdef MODULE_LOCAL
    server_ctx->remote_addr     = remote_addr;
    server_ctx->remote_addr_len = remote_addr_len;
上一篇 下一篇

猜你喜欢

热点阅读