muduo库分析——net篇(4)Socket相关

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)

其他的就是各种转换函数


你可能感兴趣的:(c++)