muduo将Socket中系统调用封装在sockets命名空间中,这是对socket各种操作的一种抽象
socket本身的一些操作比如bind,accept等等单独抽象成一个socket类
由于在linux下,有各种socket地址结构体,因此 还有专门的InetAddress地址器
先看SocketsOps文件,这是socket底层操作的封装
创建一个socket
int sockets::createNonblockingOrDie(sa_family_t family) { #if VALGRIND //设置内存泄露检查点,检查文件描述符相关内存 int sockfd = ::socket(family, SOCK_STREAM, IPPROTO_TCP); if (sockfd < 0) { LOG_SYSFATAL << "sockets::createNonblockingOrDie"; } setNonBlockAndCloseOnExec(sockfd); #else //Linux2.6以上调用可以直接设置非阻塞型socket int sockfd = ::socket(family, SOCK_STREAM | SOCK_NONBLOCK | SOCK_CLOEXEC, IPPROTO_TCP); if (sockfd < 0) { LOG_SYSFATAL << "sockets::createNonblockingOrDie"; } #endif return sockfd; }
绑定一个socket
void sockets::bindOrDie(int sockfd, const struct sockaddr* addr)
监听
void sockets::listenOrDie(int sockfd) { int ret = ::listen(sockfd, SOMAXCONN); //SOMAXCONN监听队列长度,默认128 ... }
接受新的链接:
int sockets::accept(int sockfd, struct sockaddr_in6* addr) { .... int savedErrno = errno; //储存的原因在于LOG_SYSERR中的系统调用出错可能导致ERRNO改变
其中一个读:
//iovec数组,每个iovec指向一块内存和大小 ssize_t sockets::readv(int sockfd, const struct iovec *iov, int iovcnt)
//关闭写功能 void sockets::shutdownWrite(int sockfd)
还有很多,也比较简单就不多说
Socket类:
成员:
private: const int sockfd_;
说明这个类是用来控制的,管理相关socket描述符操作
// 传入一个地址器,隐藏accept操作 int Socket::accept(InetAddress* peeraddr)
// 是否关闭Nagle算法 // optval相当于要将相关选项修改成对应的值 void Socket::setTcpNoDelay(bool on) { int optval = on ? 1 : 0; ::setsockopt(sockfd_, IPPROTO_TCP, TCP_NODELAY, &optval, static_cast<socklen_t>(sizeof optval)); // FIXME CHECK }
// 是否开启TCP层心跳 void Socket::setKeepAlive(bool on)
InetAddress
创建一个监听用的地址
InetAddress::InetAddress(uint16_t port, bool loopbackOnly, bool ipv6)
创建一个外来链接地址
InetAddress::InetAddress(StringArg ip, uint16_t port, bool ipv6)
其他的就是各种转换函数