参考《Linux高性能服务器编程》


网络编程常用函数

  • 字节序
  • ip转换
  • 地址结构体
  • socket相关函数
  • 数据读写
  • 获取地址信息
  • 获取或者设置套接字属性
  • 通过域名或地址获取主机信息

字节序

#include <arpa/inet.h>
//htonl 把unsigned long类型从主机序转换到网络序
uint32_t htonl(uint32_t hostlong);  //htons 把unsigned short类型从主机序转换到网络序
uint16_t htons(uint16_t hostshort); //ntohl 把unsigned long类型从网络序转换到主机序
uint32_t ntohl(uint32_t netlong);//ntohs 把unsigned short类型从网络序转换到主机序
uint16_t ntohs(uint16_t netshort);

ip转换

#include <arpa/inet.h>
//点分十进制转二进制
int inet_pton(int family, const char *strptr, void *addrptr);//二进制转点分十进制
const char * inet_ntop(int family, const void *addrptr, char *strptr, size_t len);
  • family:AF_INET(ipv4)、AF_INET6(ipv6)
  • strptr:点分十进制字符串
  • addrptr:二进制地址
  • len:strptr需要的大小

地址结构体

  • 通用地址结构

    #inlcude <bits/socket.h>
    struct sockaddr
    {sa_family_t sa_family;char sa_data[14];
    };
    struct sockaddr_storage
    {sa_family_t sa_family;unsigned long int __ss_align;char __ss_padding[128-sizeof(__ss_align)]; //用于结构体对齐
    };
    
  • 专用地址结构体

    #include <sys/un.h>// unix域
    struct sockaddr_un
    {sa_family_t sun_family;     // 地址族:AF_UNIXchar sun_path[108];         // 文件路径名
    };// IPv4
    struct sockaddr_in
    {sa_family_t sin_family;     // 地址族:AF_INETu_int16_t sin_port;         // 端口号,用网络字节序表示struct in_addr sin_addr;    // IPv4地址结构体
    };
    struct in_addr
    {u_int32_t s_addr;           // IPv4地址,用网络字节序表示
    };// IPv6
    struct sockaddr_in6
    {sa_family_t sin6_family;    // 地址族:AF_INET6u_int16_t sin6_port;        // 端口号,用网络字节序表示u_int32_t sin6_flowinfo;    // 流信息,应设置为0struct in6_addr sin6_addr;  // IPv6地址结构体u_int32_t sin6_scope_id;    // scope ID,尚处于实验阶段
    };
    struct in6_addr
    {unsigned char sa_addr[16];  // IPv6地址,用网络字节序表示
    };
    

socket相关函数

  • socket函数 创建socket

    #include <sys/types.h>
    #include <sys/socket.h>
    int socket(int domain, int type, int protocol);
    
    • protofamily:协议族(family)。AF_INET(IPV4)、AF_INET6(IPV6)、AF_LOCAL、AF_UNIX等。
    • type:指定socket类型。SOCK_STREAM(TCP)、SOCK_DGRAM(UDP)、SOCK_RAW、SOCK_PACKET等。与SOCK_NONBLOCK表示创建非阻塞socket,与SOCK_CLOEXEC表示fork创建的子进程中关闭该socket。
    • protocol:指定协议。IPPROTO_TCP、IPPTOTO_UDP、IPPROTO_SCTP、IPPROTO_TIPC等。一般填 0 默认和type适配。
  • bind函数 绑定IP地址和端口号

    #include <sys/types.h>
    #include <sys/socket.h>
    int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
    
    • sockfd: socket描述符

    • addr:前面的地址结构体

    • addrlen: 第二个参数中结构体的大小

  • listen函数 监听

    #include <sys/socket.h>
    int listen(int sockfd, int backlog);
    
    • sockfd: socket描述符
    • backlog:全连接队列上限
  • connect函数 建立一个连接

    #include <sys/types.h>
    #include <sys/socket.h>
    int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
    
    • sockfd: socket描述符
    • addr:对端地址信息
    • addrlen:addr的大小
  • accept函数 接受一个连接

    #include <sys/types.h>
    #include <sys/socket.h>
    int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
    
    • sockfd: socket描述符
    • addr:对端地址信息
    • addrlen:addr的大小
  • shutdown函数 关闭套接字的读或写端

    #include <sys/socket.h>
    int shutdown(int sockfd,int how);
    
    • sockfd: socket描述符
    • how:SHUT_RD 断开输入流;SHUT_WR 断开输出流;SHUT_RDWR 同时断开 I/O 流

数据读写

  • recv和send用于TCP流数据读写

    #include <sys/types.h>
    #include <sys/socket.h>
    ssize_t recv(int sockfd, void *buf, int len, int flags);
    ssize_t send(int sockfd, const void *buf, size_t len, int flags);
    
    • sockfd: socket描述符
    • buf:数据缓冲区
    • len:buf大小
    • flag:0 阻塞式发送;MSG_NOSIGNAL 当连接断开不产生SIGPIPE信号;MSG_DONTWAIT 非阻塞…
    • 返回:实际发送或接收字节数;<0 出错;recv返回0表示连接断开
  • recvfrom和sendto用于UDP数据报读写

    #include <sys/socket.h>
    ssize_t recvfrom(int sockfd, const void *buf, size_t len, int flags,const struct sockaddr *src_addr, socklen_t *addrlen);
    ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,const struct sockaddr *dest_addr, socklen_t addrlen);
    
    • 相比recv和send多出的src_addr和dest_addr为对端的地址信息,addrlen指定其长度。当后两个参数都写NULL等同于recv和send的使用。
  • 通用数据读写sendmsg和recvmsg

    #include <sys/socket.h>
    ssize_t sendmsg(int sockfd, const struct msghdr *msg, int flags);
    ssize_t recvmsg(int sockfd, struct msghdr *msg, int flags);
    struct msghdr {void          *msg_name;         /* protocol address */socklen_t     msg_namelen;       /* size of protocol address */struct iovec  *msg_iov;          /* scatter/gatter array */int           msg_iovlen         /* elements in msg_iov array */void          *msg_control;      /* ancillary data (cmsghdr struct) */socklen_t     msg_controllen;    /* length of ancillary data */int           msg_flags;         /* flags returned by recvmsg */
    };
    struct iovec {ptr_t iov_base; /* Starting address */size_t iov_len; /* Length in bytes */
    };
    
    • msg_name、msg_namelen:UDP传输时对端地址结构和其长度,TCP传输时置NULL
    • msg_iov:输入或输出的缓冲区数组,其元素指定了分散的缓冲区的地址和长度,msg_iovlen成员指定了该数组大小
    • msg_control和msg_controllen:辅助数据的位置和大小
    • msg_flags:会复制flag的值,无须设定

获取地址信息

#include <sys/socket.h>//获取本端socket地址
int getsockname(int sockfd, struct sockaddr *localaddr, socklen_t *addrlen);
//获取对端socket地址
int getpeername(int sockfd, struct sockaddr *peeraddr, socklen_t *addrlen);
  • 返回0代表成功,-1代表失败并设置errno

获取或者设置套接字属性

#include <sys/types.h>
#include <sys/socket.h>int getsockopt(int sock, int level, int optname, void *optval, socklen_t *optlen);
int setsockopt(int sock, int level, int optname, const void *optval, socklen_t optlen);
  • sock:套接字描述符

  • level:选项所在的协议层。SOL_SOCKET、IPPROTO_IP、IPPROTO_IPV6、IPPROTO_TCP等

  • optname:需要设置或访问的选项名

  • optval:存放选项值的地址

  • optlen:选项值长度

  • optname:

    选项名称        说明                  数据类型
    ========================================================================SOL_SOCKET
    ------------------------------------------------------------------------
    SO_BROADCAST       允许发送广播数据            int
    SO_DEBUG        允许调试                int
    SO_DONTROUTE       不查找路由               int
    SO_ERROR         获得套接字错误             int
    SO_KEEPALIVE      保持连接                int
    SO_LINGER        延迟关闭连接              struct linger
    SO_OOBINLINE      带外数据放入正常数据流         int
    SO_RCVBUF        接收缓冲区大小             int
    SO_SNDBUF        发送缓冲区大小             int
    SO_RCVLOWAT       接收缓冲区下限             int
    SO_SNDLOWAT       发送缓冲区下限             int
    SO_RCVTIMEO       接收超时                struct timeval
    SO_SNDTIMEO       发送超时                struct timeval
    SO_REUSERADDR      允许重用本地地址和端口         int
    SO_TYPE         获得套接字类型             int
    SO_BSDCOMPAT      与BSD系统兼容              int
    ========================================================================IPPROTO_IP
    ------------------------------------------------------------------------
    IP_HDRINCL       在数据包中包含IP首部          int
    IP_OPTINOS       IP首部选项               int
    IP_TOS         服务类型
    IP_TTL         生存时间                int
    ========================================================================IPPRO_TCP
    ------------------------------------------------------------------------
    TCP_MAXSEG       TCP最大数据段的大小           int
    TCP_NODELAY       不使用Nagle算法             int
    ========================================================================
    

通过域名或地址获取主机信息

#include <netdb.h>
struct hostent *gethostbyname(const char *ghostname);
struct hostent * gethostbyaddr(const char *addr, size_t len , int family);
struct hostent {char  *h_name;        /*  official name of host */char  **h_aliases;    /*  pointer to array of pointers to alias name */int     h_addrtype;   /*  host address type: AF_INET */int     h_length;     /*  length of address: 4 */char  **h_addr_list;  /*  ptr to array of ptrs with IPv4 addrs */
};
  • h_name:主机规范名
  • h_aliases:主机别名列表
  • h_addrtype:主机ip地址类型
  • h_length :主机ip地址列表长度
  • h_addr_list:主机的ip地址列表(网络字节序)

socket网络编程常用C语言api函数(Linux)相关推荐

  1. socket网络编程常用的结构及函数小结

    IP地址的作用时标示计算机的网卡地址,每台计算机都有一个IP地址:端口,是指计算机中为了标示在计算机中访问网络的不同程序而设的编号,并不是网卡接线的端口,而是不同程序的逻辑编号,并不是实际存在的:域名 ...

  2. Linux socket 网络编程常用函数总结

    1.字节序函数 #include <netinet.h> uint16_t htons(uint16_t host16bitvalue); uint32_t htonl(uint32_t  ...

  3. Linux socket 网络编程 常用头文件

    一 三种类型的套接字: 1.流式套接字(SOCKET_STREAM) 提供面向连接的可靠的数据传输服务.数据被看作是字节流,无长度限制.例如FTP协议就采用这种. 2.数据报式套接字(SOCKET_D ...

  4. 视频教程-C++socket网络编程--http服务器(支持php)实战教学视频-C/C++

    C++socket网络编程--http服务器(支持php)实战教学视频 夏曹俊:南京捷帝科技有限公司创始人,南京大学计算机硕士毕业,有15年c++跨平台项目研发的经验,领导开发过大量的c++虚拟仿真, ...

  5. C++socket网络编程大全实战http服务器(支持php)视频课程-夏曹俊-专题视频课程

    C++socket网络编程大全实战http服务器(支持php)视频课程-16782人已学习 课程介绍         C++socket网络编程大全实战http服务器(支持php)视频培训教程概况:本 ...

  6. 【socket】C语言的Socket网络编程

    目录 Socket网络编程 1.网络知识 网络中进程之间如何通信? 什么是Socket? socket一词的起源 怎么理解端口? 怎么理解socket ? 2. 客户/服务器模式 2.1 服务器端: ...

  7. Linux网络编程常用api

    文章目录 总览 大端小端 大小端检测 大小端转换 socket地址API 通用socket地址 专用socket地址 PF_UNIX专用地址 PF_INET PF_INET6 总结 IP转换函数 例子 ...

  8. 5.3linux下C语言socket网络编程简例

    原创文章,转载请注明转载字样和出处,谢谢! 这里给出在Linux下的简单socket网络编程的实例,使用tcp协议进行通信,服务端进行监听,在收到客户端的连接后,发送数据给客户端:客户端在接受到数据后 ...

  9. linux下C语言socket网络编程简例

    转自博文:http://blog.csdn.net/kikilizhm/article/details/7858405 在练习写网络编程时,该例给了我帮助,在写服务器时,我把while逻辑位置想法错了 ...

最新文章

  1. Linux终端上如何将图像转换成 ASCII 艺术
  2. 查找运行时间超过1天的frmweb进程
  3. Java基础-JAVA中常见的数据结构介绍
  4. 出租房的网络环境研究
  5. 前端学习(2666):完成vue3.0的todolist编辑
  6. Android中LocalSocket使用
  7. CoderForces999D-Equalize the Remainders
  8. Scala 隐式转换
  9. ClickHouse安装部署与SQL实战
  10. 3.11 Ext JS 下拉框(Combobox)使用
  11. XenApp备份方法
  12. Qt-textEdit 滚顶条设置只读模式
  13. CSS学习18:CSS选择器二
  14. 《教父II:西西里人》 shbp--3
  15. kettle源码分析之3 carte与rest api
  16. 将UTC时间格式转换成东八区时间格式
  17. Node 学习 | Day03 express (初识Express、Express 路由、Express 中间件、使用 Express 写接口)
  18. 排列 组合 算法(一)
  19. Duplicated tag: ‘build‘出现此报错是因为标签配置重复。
  20. 你应该知道的requestIdleCallback

热门文章

  1. 大颗粒积木【电话】教案-课堂演示-说课-少儿积木建构创意评测与展示活动
  2. el-select样式两种修改方式index.html或popper-append-to-body加popper-class
  3. 如何提取文件名到excel表中
  4. 抖音seo视频矩阵系统搭建源码|技术研发
  5. 灵敏度,最小可探测量,NEP
  6. 《挪威的森林》进行时
  7. Veeam BR 01 介绍
  8. 冰山立方体BUC算法(附测试集和完整代码)
  9. C#中 如何关联键盘按钮 (KeyChar/KeyCode值 KeyPress/KeyDown事件 区别)
  10. HPU272 wzy的大冒险——出发前的清理(米勒罗宾板子)