zoukankan      html  css  js  c++  java
  • accept相关

    #include <sys/types.h>          /* See NOTES */
    #include <sys/socket.h>
    
    int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
    
    #define _GNU_SOURCE             /* See feature_test_macros(7) */
    #include <sys/socket.h>
    
    int accept4(int sockfd, struct sockaddr *addr, socklen_t *addrlen, int flags);
    

    用于面向连接的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:防火墙禁止连接
  • 相关阅读:
    [Tips] 树莓派VNC登录
    [Tips] 联通宽带+华为路由器,如何进行NAT
    [Tips] 树莓派4B 风扇安装
    [Tips] 家庭树莓派,如何外网访问
    [Tips] 命令行获取设备的外网IP
    MySQL 如何让自增id设置为从1开始
    MySQL报错:Packet for query is too large (2,588 > 2,048).
    Java 实现 Timstamp 和 String 互相转换
    MySQL修改 mysql-bin 日志保存天数以及文件大小限制
    Linux Shell 中的年月日 时分秒
  • 原文地址:https://www.cnblogs.com/suntus/p/14920765.html
Copyright © 2011-2022 走看看