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.
