socket网络编程常用C语言api函数(Linux)
参考《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)相关推荐
- socket网络编程常用的结构及函数小结
IP地址的作用时标示计算机的网卡地址,每台计算机都有一个IP地址:端口,是指计算机中为了标示在计算机中访问网络的不同程序而设的编号,并不是网卡接线的端口,而是不同程序的逻辑编号,并不是实际存在的:域名 ...
- Linux socket 网络编程常用函数总结
1.字节序函数 #include <netinet.h> uint16_t htons(uint16_t host16bitvalue); uint32_t htonl(uint32_t ...
- Linux socket 网络编程 常用头文件
一 三种类型的套接字: 1.流式套接字(SOCKET_STREAM) 提供面向连接的可靠的数据传输服务.数据被看作是字节流,无长度限制.例如FTP协议就采用这种. 2.数据报式套接字(SOCKET_D ...
- 视频教程-C++socket网络编程--http服务器(支持php)实战教学视频-C/C++
C++socket网络编程--http服务器(支持php)实战教学视频 夏曹俊:南京捷帝科技有限公司创始人,南京大学计算机硕士毕业,有15年c++跨平台项目研发的经验,领导开发过大量的c++虚拟仿真, ...
- C++socket网络编程大全实战http服务器(支持php)视频课程-夏曹俊-专题视频课程
C++socket网络编程大全实战http服务器(支持php)视频课程-16782人已学习 课程介绍 C++socket网络编程大全实战http服务器(支持php)视频培训教程概况:本 ...
- 【socket】C语言的Socket网络编程
目录 Socket网络编程 1.网络知识 网络中进程之间如何通信? 什么是Socket? socket一词的起源 怎么理解端口? 怎么理解socket ? 2. 客户/服务器模式 2.1 服务器端: ...
- Linux网络编程常用api
文章目录 总览 大端小端 大小端检测 大小端转换 socket地址API 通用socket地址 专用socket地址 PF_UNIX专用地址 PF_INET PF_INET6 总结 IP转换函数 例子 ...
- 5.3linux下C语言socket网络编程简例
原创文章,转载请注明转载字样和出处,谢谢! 这里给出在Linux下的简单socket网络编程的实例,使用tcp协议进行通信,服务端进行监听,在收到客户端的连接后,发送数据给客户端:客户端在接受到数据后 ...
- linux下C语言socket网络编程简例
转自博文:http://blog.csdn.net/kikilizhm/article/details/7858405 在练习写网络编程时,该例给了我帮助,在写服务器时,我把while逻辑位置想法错了 ...
最新文章
- Linux终端上如何将图像转换成 ASCII 艺术
- 查找运行时间超过1天的frmweb进程
- Java基础-JAVA中常见的数据结构介绍
- 出租房的网络环境研究
- 前端学习(2666):完成vue3.0的todolist编辑
- Android中LocalSocket使用
- CoderForces999D-Equalize the Remainders
- Scala 隐式转换
- ClickHouse安装部署与SQL实战
- 3.11 Ext JS 下拉框(Combobox)使用
- XenApp备份方法
- Qt-textEdit 滚顶条设置只读模式
- CSS学习18:CSS选择器二
- 《教父II:西西里人》 shbp--3
- kettle源码分析之3 carte与rest api
- 将UTC时间格式转换成东八区时间格式
- Node 学习 | Day03 express (初识Express、Express 路由、Express 中间件、使用 Express 写接口)
- 排列 组合 算法(一)
- Duplicated tag: ‘build‘出现此报错是因为标签配置重复。
- 你应该知道的requestIdleCallback
热门文章
- 大颗粒积木【电话】教案-课堂演示-说课-少儿积木建构创意评测与展示活动
- el-select样式两种修改方式index.html或popper-append-to-body加popper-class
- 如何提取文件名到excel表中
- 抖音seo视频矩阵系统搭建源码|技术研发
- 灵敏度,最小可探测量,NEP
- 《挪威的森林》进行时
- Veeam BR 01 介绍
- 冰山立方体BUC算法(附测试集和完整代码)
- C#中 如何关联键盘按钮 (KeyChar/KeyCode值 KeyPress/KeyDown事件 区别)
- HPU272 wzy的大冒险——出发前的清理(米勒罗宾板子)