user-tcpip.c

来自「lustre 1.6.5 source code」· C语言 代码 · 共 605 行 · 第 1/2 页

C
605
字号
        pfd.events = POLLIN;        pfd.revents = 0;        /* poll(2) measures timeout in msec */        timeout *= 1000;                while (nob != 0 && timeout > 0) {                cfs_time_t current_time;                rc = poll(&pfd, 1, timeout);                if (rc < 0)                        return -errno;                if (rc == 0)                        return -ETIMEDOUT;                if ((pfd.revents & POLLIN) == 0)                        return -EIO;                                                rc = read(sock, buffer, nob);                                if (rc < 0)                        return -errno;                if (rc == 0)                        return -EIO;                                buffer = ((char *)buffer) + rc;                nob -= rc;                current_time = cfs_time_current();                timeout -= cfs_duration_sec(cfs_time_sub(cfs_time_current(),                                                        start_time));        }                if (nob == 0)                return 0;        else                return -ETIMEDOUT;}/* Just try to connect to localhost to wake up entity that are * sleeping in accept() */voidlibcfs_sock_abort_accept(__u16 port){        int                fd, rc;        struct sockaddr_in locaddr;        memset(&locaddr, 0, sizeof(locaddr));        locaddr.sin_family = AF_INET;        locaddr.sin_port = htons(port);        locaddr.sin_addr.s_addr = inet_addr("127.0.0.1");        fd = socket(AF_INET, SOCK_STREAM, 0);        if ( fd < 0 ) {                CERROR("socket() failed: errno==%d\n", errno);                return;        }                        rc = connect(fd, (struct sockaddr *)&locaddr, sizeof(locaddr));        if ( rc != 0 ) {                if ( errno != ECONNREFUSED )                        CERROR("connect() failed: errno==%d\n", errno);                else                        CDEBUG(D_NET, "Nobody to wake up at %d\n", port);        }                close(fd);}/* * Network functions of common use */intlibcfs_getpeername(int sock_fd, __u32 *ipaddr_p, __u16 *port_p){        int                rc;        struct sockaddr_in peer_addr;        socklen_t          peer_addr_len = sizeof(peer_addr);        rc = getpeername(sock_fd, (struct sockaddr *)&peer_addr, &peer_addr_len);        if (rc != 0)                return -errno;                if (ipaddr_p != NULL)                *ipaddr_p = ntohl(peer_addr.sin_addr.s_addr);        if (port_p != NULL)                *port_p = ntohs(peer_addr.sin_port);        return 0;}intlibcfs_socketpair(int *fdp){        int rc, i;                rc = socketpair(AF_UNIX, SOCK_STREAM, 0, fdp);        if (rc != 0) {                rc = -errno;                CERROR ("Cannot create socket pair\n");                return rc;        }                for (i = 0; i < 2; i++) {                rc = libcfs_fcntl_nonblock(fdp[i]);                if (rc) {                        close(fdp[0]);                                                close(fdp[1]);                        return rc;                }        }                return 0;}intlibcfs_fcntl_nonblock(int fd){        int rc, flags;                flags = fcntl(fd, F_GETFL, 0);        if (flags == -1) {                rc = -errno;                CERROR ("Cannot get socket flags\n");                return rc;        }                rc = fcntl(fd, F_SETFL, flags | O_NONBLOCK);        if (rc != 0) {                rc = -errno;                CERROR ("Cannot set socket flags\n");                return rc;        }                return 0;}intlibcfs_sock_set_nagle(int fd, int nagle){        int rc;        int option = nagle ? 0 : 1;#if defined(__sun__) || defined(__sun)        rc = setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, &option, sizeof(option));#else        rc = setsockopt(fd, SOL_TCP, TCP_NODELAY, &option, sizeof(option));#endif        if (rc != 0) {                rc = -errno;                CERROR ("Cannot set NODELAY socket option\n");                return rc;        }        return 0;}intlibcfs_sock_set_bufsiz(int fd, int bufsiz){        int rc, option;                LASSERT (bufsiz != 0);        option = bufsiz;        rc = setsockopt(fd, SOL_SOCKET, SO_SNDBUF, &option, sizeof(option));        if (rc != 0) {                rc = -errno;                CERROR ("Cannot set SNDBUF socket option\n");                return rc;        }        option = bufsiz;        rc = setsockopt(fd, SOL_SOCKET, SO_RCVBUF, &option, sizeof(option));        if (rc != 0) {                rc = -errno;                CERROR ("Cannot set RCVBUF socket option\n");                return rc;        }        return 0;}intlibcfs_sock_create(int *fdp){        int rc, fd, option;        fd = socket(AF_INET, SOCK_STREAM, 0);        if (fd < 0) {                rc = -errno;                CERROR ("Cannot create socket\n");                return rc;        }        option = 1;        rc = setsockopt(fd, SOL_SOCKET, SO_REUSEADDR,                         &option, sizeof(option));        if (rc != 0) {                rc = -errno;                CERROR  ("Cannot set SO_REUSEADDR for socket\n");                close(fd);                return rc;        }                 *fdp = fd;        return 0;}intlibcfs_sock_bind_to_port(int fd, __u16 port){        int                rc;        struct sockaddr_in locaddr;        memset(&locaddr, 0, sizeof(locaddr));         locaddr.sin_family = AF_INET;         locaddr.sin_addr.s_addr = INADDR_ANY;        locaddr.sin_port = htons(port);        rc = bind(fd, (struct sockaddr *)&locaddr, sizeof(locaddr));        if (rc != 0) {                rc = -errno;                CERROR  ("Cannot bind to port %d\n", port);                return rc;        }        return 0;}intlibcfs_sock_connect(int fd, __u32 ip, __u16 port){        int                rc;        struct sockaddr_in addr;        memset(&addr, 0, sizeof(addr));        addr.sin_family      = AF_INET;        addr.sin_addr.s_addr = htonl(ip);        addr.sin_port        = htons(port);                rc = connect(fd, (struct sockaddr *)&addr,                     sizeof(struct sockaddr_in));        if(rc != 0 && errno != EINPROGRESS) {                rc = -errno;                if (rc != -EADDRINUSE && rc != -EADDRNOTAVAIL)                        CERROR ("Cannot connect to %u.%u.%u.%u:%d (err=%d)\n",                                HIPQUAD(ip), port, errno);                return rc;        }        return 0;}/* NB: EPIPE and ECONNRESET are considered as non-fatal * because: * 1) it still makes sense to continue reading && * 2) anyway, poll() will set up POLLHUP|POLLERR flags */ int libcfs_sock_writev(int fd, const struct iovec *vector, int count){        int rc;                rc = syscall(SYS_writev, fd, vector, count);                if (rc == 0) /* write nothing */                 return 0;                if (rc < 0) {                if (errno == EAGAIN ||   /* write nothing   */                    errno == EPIPE ||    /* non-fatal error */                    errno == ECONNRESET) /* non-fatal error */                        return 0;                else                        return -errno;        }        return rc;}int libcfs_sock_readv(int fd, const struct iovec *vector, int count){        int rc;                rc = syscall(SYS_readv, fd, vector, count);                if (rc == 0) /* EOF */                 return -EIO;                if (rc < 0) {                if (errno == EAGAIN) /* read nothing */                        return 0;                else                        return -errno;        }        return rc;}#endif /* !defined(REDSTORM) */#endif /* !__KERNEL__ */

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?