int tcpsetserveropt(int fd, const int timeout) { int flags; int result; struct linger linger; struct timeval waittime; linger.l_onoff = 1; linger.l_linger = timeout; if (setsockopt(fd, SOL_SOCKET, SO_LINGER, \ &linger, (socklen_t)sizeof(struct linger)) < 0) { logError("file: "__FILE__", line: %d, " \ "setsockopt failed, errno: %d, error info: %s", \ __LINE__, errno, strerror(errno)); return errno != 0 ? errno : ENOMEM; } waittime.tv_sec = timeout; waittime.tv_usec = 0; if (setsockopt(fd, SOL_SOCKET, SO_SNDTIMEO, &waittime, (socklen_t)sizeof(struct timeval)) < 0) { logError("file: "__FILE__", line: %d, " \ "setsockopt failed, errno: %d, error info: %s", \ __LINE__, errno, strerror(errno)); return errno != 0 ? errno : ENOMEM; } if (setsockopt(fd, SOL_SOCKET, SO_RCVTIMEO, &waittime, (socklen_t)sizeof(struct timeval)) < 0) { logError("file: "__FILE__", line: %d, " \ "setsockopt failed, errno: %d, error info: %s", \ __LINE__, errno, strerror(errno)); return errno != 0 ? errno : ENOMEM; } flags = 1; if (setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, \ (char *)&flags, sizeof(flags)) < 0) { logError("file: "__FILE__", line: %d, " \ "setsockopt failed, errno: %d, error info: %s", \ __LINE__, errno, strerror(errno)); return errno != 0 ? errno : EINVAL; } if ((result=tcpsetkeepalive(fd, 2 * timeout + 1)) != 0) { return result; } return 0; }
int tcpsetnodelay(int fd, const int timeout) { int flags; int result; if ((result=tcpsetkeepalive(fd, 2 * timeout + 1)) != 0) { return result; } flags = 1; if (setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, \ (char *)&flags, sizeof(flags)) < 0) { logError("file: "__FILE__", line: %d, " \ "setsockopt failed, errno: %d, error info: %s", \ __LINE__, errno, STRERROR(errno)); return errno != 0 ? errno : EINVAL; } return 0; }
int tcpsetserveropt(int fd, const int timeout) { int flags; int result; struct linger linger; struct timeval waittime; linger.l_onoff = 1; linger.l_linger = timeout * 100; if (setsockopt(fd, SOL_SOCKET, SO_LINGER, \ &linger, (socklen_t)sizeof(struct linger)) < 0) { logError("file: "__FILE__", line: %d, " \ "setsockopt failed, errno: %d, error info: %s", \ __LINE__, errno, STRERROR(errno)); return errno != 0 ? errno : ENOMEM; } waittime.tv_sec = timeout; waittime.tv_usec = 0; if (setsockopt(fd, SOL_SOCKET, SO_SNDTIMEO, &waittime, (socklen_t)sizeof(struct timeval)) < 0) { logWarning("file: "__FILE__", line: %d, " \ "setsockopt failed, errno: %d, error info: %s", \ __LINE__, errno, STRERROR(errno)); } if (setsockopt(fd, SOL_SOCKET, SO_RCVTIMEO, &waittime, (socklen_t)sizeof(struct timeval)) < 0) { logWarning("file: "__FILE__", line: %d, " \ "setsockopt failed, errno: %d, error info: %s", \ __LINE__, errno, STRERROR(errno)); } /* { int bytes; int size; bytes = 0; size = sizeof(int); if (getsockopt(fd, SOL_SOCKET, SO_SNDBUF, &bytes, (socklen_t *)&size) < 0) { logError("file: "__FILE__", line: %d, " \ "getsockopt failed, errno: %d, error info: %s", \ __LINE__, errno, STRERROR(errno)); return errno != 0 ? errno : ENOMEM; } printf("send buff size: %d\n", bytes); if (getsockopt(fd, SOL_SOCKET, SO_RCVBUF, &bytes, (socklen_t *)&size) < 0) { logError("file: "__FILE__", line: %d, " \ "getsockopt failed, errno: %d, error info: %s", \ __LINE__, errno, STRERROR(errno)); return errno != 0 ? errno : ENOMEM; } printf("recv buff size: %d\n", bytes); } */ flags = 1; if (setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, \ (char *)&flags, sizeof(flags)) < 0) { logError("file: "__FILE__", line: %d, " \ "setsockopt failed, errno: %d, error info: %s", \ __LINE__, errno, STRERROR(errno)); return errno != 0 ? errno : EINVAL; } if ((result=tcpsetkeepalive(fd, 2 * timeout + 1)) != 0) { return result; } return 0; }