int Acceptor::accept(struct sockaddr_in* addr) { socklen_t addrlen = static_cast<socklen_t>(sizeof *addr); #if VALGRIND int connfd = accept(m_sockfd, sockaddr_cast(addr), &addrlen); Socket::setNonBlock(connfd); Socket::setCloseExec(connfd); #else int connfd = accept4(m_sockfd, (struct sockaddr*)(addr), &addrlen, SOCK_NONBLOCK | SOCK_CLOEXEC); #endif if (connfd < 0) { int err = errno; if (err == EMFILE || err == ENFILE) { ERROR("accept error %s", strerror(err)); close(m_dummyFd); connfd = ::accept(m_sockfd, nullptr, nullptr); close(connfd); m_dummyFd = createDummyFd(); } return -1; } else { INFO("onAccept %d", connfd); //设置TCP缓冲数据立即发送 Socket::setNoDelay(connfd, true); return connfd; } }
struct sockaddr_in SocketUtil::getPeerAddr(ZL_SOCKET sockfd) { struct sockaddr_in peeraddr; ::memset(&peeraddr, 0, sizeof(peeraddr)); socklen_t addrlen = static_cast<socklen_t>(sizeof peeraddr); if (::getpeername(sockfd, sockaddr_cast(&peeraddr), &addrlen) < 0) { printf("sockets::getPeerAddr"); } return peeraddr; }
struct sockaddr_in SocketUtil::getLocalAddr(ZL_SOCKET sockfd) { struct sockaddr_in localaddr; ::memset(&localaddr, 0, sizeof(localaddr)); socklen_t addrlen = static_cast<socklen_t>(sizeof(localaddr)); if (::getsockname(sockfd, sockaddr_cast(&localaddr), &addrlen) < 0) { printf("sockets::getLocalAddr"); } return localaddr; }
int socks::connect(int sockfd, const struct sockaddr_in &addr) { int conn_fd; conn_fd = ::connect(sockfd, sockaddr_cast(&addr), static_cast<socklen_t>(sizeof(addr))); if(conn_fd < 0) { fprintf(stderr, "connect error"); } return conn_fd; }
int socks::bind(int sockfd, const struct sockaddr_in &addr) { int ret; ret = ::bind(sockfd, sockaddr_cast(&addr), static_cast<socklen_t>(sizeof(addr))); if(ret < 0) { fprintf(stderr, "bind error"); } return ret; }
int socks::accept(int sockfd, struct sockaddr_in *addr) { socklen_t addrlen = static_cast<socklen_t>(sizeof(*addr)); int conn_fd; conn_fd = ::accept(sockfd, sockaddr_cast(addr), &addrlen); if(conn_fd < 0) { fprintf(stderr, "accpet error"); return conn_fd; } set_nonblock(conn_fd); return conn_fd; }