…
| 1 | 
 | 
用于面向连接的socket类型(SOCK_STREAM, SOCK_SEQPACKET)。从监听套接字待连接的队列中获取第一个连接请求,创建一个新的套接字,用新的fd指向这个新的套接字,新创建的套接字不处于监听状态。不影响监听套接字sockfd。
addr中返回对端地址。
注意,addrlen虽然是个出参,但输入的时候必须初始化成sizeof(*addr)。
如果addr内存太小,输出的地址会被截断,这时addrlen会大于sizeof(*addr)。
sockfd上有可读事件,表示有新连接接入,因此可以使用select(2),poll(2),epoll这些来监听sockfd。
flags为0时,两个函数一样。flags可以有:
- SOCK_NONBLOCK: 直接设置成非阻塞模式,不需要再调用fcntl(2)了
- SOCK_CLOEXEC: 在新建连接的fd上设置close-on-exec(FD_CLOEXEC)标志。
返回的错误:
- EAGAIN,EWOULDBLOCK: sockfd为非阻塞,并且当前没有新连接;
- EBADF: sockfd无效
- ECONNABORTED: 一个连接被中断
- EFAULT:addr参数不是个可写的地址
- EINTR: 在有效连接到达前,被信号中断
- EINVAL:sockfd还是个监听套接字,或者addrlen无效
- EMFILE:每进程可打开的fd个数达到上限
- ENFILE:系统整体可打开的fd个数达到上限
- ENOBUFS,ENOMEM:内存不够,通常是socket buffer限制,而不是系统内存不够了
- ENOTSOCK:fd指向文件,而不是个socket
- EOPNOTSUPP:sockfd不是SOCK_STREAM类型的
- EPROTO:协议错误
- EPERM:防火墙禁止连接