sockets namespace
源码阅读(muduo::net::SocketsOps.h)
如果有问题,欢迎交流指正!!!
对套接字基本api比如connect
、bind
、listen
等的封装。还有一些负责类型转换的函数。
sockaddr* sockaddr_cast
一系列的重载函数,负责将输入的或是
sockaddr_in
,或是sockaddr_in6
类型的地址调用隐式类型转换转换为sockaddr
。
sockaddr_in* sockaddr_in_cast
负责将
sockaddr
类型的地址转换为sockaddr_in
sockaddr_in6* sockaddr_in6_cast
负责将
sockaddr
类型的地址装换为sockaddr_in6
int createNonblockingOrDir(sa_family_t family)
根据输入的协议族参数,创建相应的流套接字,并设为非阻塞的和不允许exec()创建的新进程使用的(
setNonBlockAndCloseOnExec
)
注:这里的OrDie
是说如果套接字创建失败,就要结束运行。
void setNonBlockingAndCloseOnExec(int sockfd)
调用
fcntl
设sockfd
所指套接字为非阻塞的(O_NONBLOCK
)和不允许exec()
创建的新进程(FD_CLOEXEC
)使用的。
void bindOrDie(int sockfd,const struct sockaddr* addr)
对
::bind
操作的封装,没有额外的内容
listenOrDie(int sockfd)
对
::listen
操作的封装,队列长度为SOMAXCONN
,SOMAXCONN
长度是多少?
int accept(int sockfd,struct sockaddr_in6* addr)
对
::accept
的封装,返回listening socket
:sockfd
上侦听到的新连接,并将其地址保存到addr
中
addr
虽然是ipv6格式的,但::accept
并不会检查格式,只会检查该空间是否足够放下数据。
另外,和之前的listenOrDie
、bindOrDie
相比,本函数如果获得的套接字无效,报错之后依旧会返回,以便Acceptor Class
处理EMFILE
的错误,而后者会直接结束程序运行。
int connect(int sockfd,const struct sockaddr* addr)
对
::connect
的封装,没有别的内容
ssize_t read(int sockfd,void* buf,size_t count)
对
::read
的封装,读count
大小的数据到buf
中,返回实际读到的长度
ssize_t readv(int sockfd,const struct *iov,int inovnt)
对
::readv
的封装。
关于ssize_t readv(int fd,const struct *iov,int inovnt)
散布读,从fd
中读取inovnt
块内存数据到iov
数组中。返回读取的数据长度。不知道具体怎么用
ssize_t write(int sockfd,const void* buf,size_t count)
对
write
的封装,从buf
写count
大小的数据到sockfd
中,返回成功写入的数据长度。
void close(int sockfd)
关闭字符串
void shutdownWrite(int sockfd)
调用
shutdown
关闭sockfd
的写功能
void toIp(char* buf,size_t size,const struct sockaddr* addr)
将
addr
的网址转为本地格式并输入给buf
,size
至少为buf
中的可用字符串长度,并大于对应的网址长度。
void toIpPort(char* buf,size_t size,const struct sockaddr* addr)
将
addr
的网址和端口转为可读格式
void sockets::fromIpPort(const char* ip,unint16_t port,struct sockaddr_in* addr) void sockets::fromIpPort(const char* ip,unint16_t port,struct sockaddr_in6* addr)
用本地顺序的
ip
和port
给addr
赋值。
int getSocketError(int sockfd)
调用
getsockopt
获取待处理的错误
struct sockaddr_in6 getLocalAddr(int sockfd)
调用
getsockname
获取与sockfd
绑定的本地地址
struct sockaddr_in6 getPeerAddr(int sockfd)
调用
getpeername
获取与sockfd
绑定的远端地址
isSelfConnect(int sockfd)
比较本地地址的端口网址和远端地址的端口网址是否一样
这是要干嘛?