• Linux 网络编程常用API


    主机字节顺序 --> 网络字节顺序

    端口号:

    uint16_t htons(uint16_t hostshort);
    
    • 1

    IP

     uint32_t htonl(uint32_t hostlong);
    
    • 1

    网络字节顺序 --> 主机字节顺序

    端口号:

    uint16_t ntohs(uint16_t netshort);
    
    • 1

    IP:

    uint32_t ntohl(uint32_t netlong);
    
    • 1

    IP地址转换函数

    本地IP转网络字节序 字符串 --> int(大端方式存储)

    int inet_pton(int af, const char *src,void *dst);
    
    • 1

    参数:

    • af:指定当前所使用的协议,AF_INET(IPV4),AF_INET6(IPV6) src:
    • IP地址(点分十进制)
    • dst:传出,网络字节序的IP地址

    网络字节序转本地IP int -> 字符串

    const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);
    //sockaddr_in(IPV4)结构
    struct sockaddr_in {
    sa_family_t sin_family; /* 地址族: AF_INET */
    u_int16_t sin_port; /* 按网络字节次序的端口 */
    struct in_addr sin_addr; /* internet地址 */
    };
    
    /* Internet地址. */
    struct in_addr {
    u_int32_t s_addr; /* 按网络字节次序的地址 */
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    参数:

    • List item

    size:dst的大小

    socket创建套接字

    int socket(int domain, int type, int protocol);
    
    • 1

    参数:

    • domin:指定协议,AF_INET、AF_INET6、AF_UNIX(本地)
    • type:指定传输协议:SOCK_STREAM(流式协议)、SOCK_DGRAM(报式协议)
    • protocol:传输协议的代表协议(如流式协议代表协议tcp,报式协议代表协议udp)。通常传0

    bind 给socket绑定本地IP和端口

    int bind(int sockfd, struct sockaddr *my_addr, socklen_t addrlen);
    
    • 1

    参数:

    • sockfd:本地socket文件描述符
    • my_addr:传入,地址结构
    • addrlen:地址结构大小

    listen 监听

    int listen(int s, int backlog);
    
    • 1

    参数:

    • s:本地socket文件描述符
    • backlog:设置同时与服务器连接的上线数

    accept 等待并接收连接请求

    int accept(int s, struct sockaddr *addr, socklen_t *addrlen);
    
    • 1

    等待客户端的连接(阻塞等待),成功则返回客户端套接字

    参数:

    • s:本地socket文件描述符
    • addr:传出,与客户端建立连接的地址结构
    • addrlen:传入传出,传入addr大小,传出客户端addr实际大小

    通信

    read/recv 接收数据

    ssize_t recv(int sockfd, void *buf, size_t len, int flags);
    
    • 1

    write/send 发送数据

    int send(int s, const void *msg, size_t len, int flags);
    
    • 1

    关闭

    close

    connect 客户端连接服务器

    int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
    
    • 1

    参数:

    • sockfd:本地socket文件描述符
    • addr:服务器的地址结构
    • addrlen:addr长度

    select

    int select(int nfds, fd_set* readfds,fd_set* writefds,fd_set* exceptfds, struct timeval* timeout)
    
    • 1

    参数

    nfds:要检测的文件描述中最大的fd + 1也可以传1024
    readfds:读集合
    writefds:写集合
    exceptfds:异常集合
    timeout:阻塞时间

    文件描述符操作函数

    void FD_ZERO(fd_set* set) 				//全部清空
    void FD_CLR(int fd,fd_set* set) 		//从集合中删除某一项
    void FD_SET(int fd,fd_set* set) 		//将某个文件描述符添加到集合
    void FD_ISSET(int fd,fd_set* set) 		//判断某个文件是否在集合中
    
    • 1
    • 2
    • 3
    • 4

    epoll

    epoll_create 生成树根节点

    int epoll_create(int size);
    
    • 1

    epoll内部是树结构,该函数生成一个根节点

    参数:

    • size:节点个数

    epoll_ctl

    int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);
    
    • 1

    用于控制某个epoll文件描述符事件,可以注册,修改,删除

    参数:

    • epfd:epoll树的根节点
    • op:对应的操作:注册:EPOLL_CTL_ADD、修改:EPOLL_CTL_MOD、删除:EPOLL_CTL_DEL
    • fd:要注册、修改、或删除的文件描述符 event:告诉内核要监听什么事件

    epoll_wait

    int epoll_wait(int epfd, struct epoll_event *events,int maxevents, int timeout);
    
    • 1

    委托内核检测哪些描述符要进行I/O操作,返回events中发生变化的个数

    参数:

    • epfd:epoll树的根节点
    • events:传出,结构体数组地址,哪些节点要进行I/O操作
    • maxevents:events大小
    • timeout:超时时间
  • 相关阅读:
    【datawhale202206】pyTorch推荐系统:召回模型 DSSM&YoutubeDNN
    1Nginx基础及编译安装
    关于多工序、多资源排程场景下的新成果
    Swin Transformer:最佳论文,准确率和性能双佳的视觉Transformer | ICCV 2021
    PackagingTool_x64_v2.0.1.0图片转档打包二进制文件合并字库生成图片软件介绍
    2.mysql的安装
    化工巨头巴斯夫&Pasqal:利用量子神经网络优化天气预报
    C语言--每日五道选择题--Day20
    偏微分方程算法之二阶双曲型方程紧交替方向隐格式
    科普丨OTP语音芯片与FLASH语音芯片的不同之处
  • 原文地址:https://blog.csdn.net/weixin_43488671/article/details/125504957