I have write a server / client for Shadowsocks(R) protocol based on libuv.
It's looks fine in windows server. but it's weird in linux.

I try to fix this issue for a few days and can not resolve it.

This is the invalid code 
<https://github.com/ShadowsocksR-Live/shadowsocksr-native/blob/master/src/client/tunnel.c#L88>
 
I added. 

My project site is ShadowsocksR-Native 
<https://github.com/ShadowsocksR-Live/shadowsocksr-native>

Please help me, any suggestions are welcome.

code snippet.

int uv_stream_fd(const uv_tcp_t *handle) {
#if defined(_WIN32)
    return (int) handle->socket;
#elif defined(__APPLE__)
    int uv___stream_fd(const uv_stream_t* handle);
    return uv___stream_fd((const uv_stream_t *)handle);
#else
    return (handle)->io_watcher.fd;
#endif
}

int set_socket_nonblocking(int fd) {
#if !(defined(WIN32) || defined(_WIN32))
    int flags;
    if (-1 == (flags = fcntl(fd, F_GETFL, 0))) {
        flags = 0;
    }
    return fcntl(fd, F_SETFL, flags | O_NONBLOCK);
#else
    return 0;
#endif
}

void set_socket_nodelay(int fd, bool enable) {
    int opt = enable ? 1 : 0;
    setsockopt(fd, SOL_TCP, TCP_NODELAY, (char *)&opt, sizeof(opt));
}

void set_socket_nosigpipe(int fd) {
#if defined(SO_NOSIGPIPE) && !defined(MSG_NOSIGNAL)
    int opt = 1;
    setsockopt(serverfd, SOL_SOCKET, SO_NOSIGPIPE, &opt, sizeof(opt));
#endif
}

void set_socket_linger(int fd) {
#ifdef __linux__
    struct linger so_linger = { 0 };
    so_linger.l_onoff  = 1;
    so_linger.l_linger = 0;
    setsockopt(fd, SOL_SOCKET, SO_LINGER, &so_linger, sizeof so_linger);
#endif
}

void fix_linux_unexpected_reset_by_incoming_peer(uv_tcp_t *socket) {
    int fd = uv_stream_fd(socket);
    set_socket_nonblocking(fd);
    set_socket_nodelay(fd, true);
    set_socket_nosigpipe(fd);
    set_socket_linger(fd);
}










<https://files.gitter.im/breakwa11/shadowsocksr/Vs6u/image.png>

<https://lh3.googleusercontent.com/-qMvtRlg4ihs/WrmjIusWMzI/AAAAAAAAAAU/Bb42uMTjVzYzsmyWoZQnMfR2aN-HDv0CQCEwYBhgL/s1600/Untitled.png>

-- 
You received this message because you are subscribed to the Google Groups 
"libuv" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/libuv.
For more options, visit https://groups.google.com/d/optout.

Reply via email to