主机字节顺序 --> 网络字节顺序
端口号:
uint16_t htons(uint16_t hostshort);
IP
uint32_t htonl(uint32_t hostlong);
网络字节顺序 --> 主机字节顺序
端口号:
uint16_t ntohs(uint16_t netshort);
IP:
uint32_t ntohl(uint32_t netlong);
IP地址转换函数
本地IP转网络字节序 字符串 --> int(大端方式存储)
int inet_pton(int af, const char *src,void *dst);
参数:
- 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);
struct sockaddr_in {
sa_family_t sin_family;
u_int16_t sin_port;
struct in_addr sin_addr;
};
struct in_addr {
u_int32_t s_addr;
};
参数:
size:dst的大小
socket创建套接字
int socket(int domain, int type, int protocol);
参数:
- 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);
参数:
- sockfd:本地socket文件描述符
- my_addr:传入,地址结构
- addrlen:地址结构大小
listen 监听
int listen(int s, int backlog);
参数:
- s:本地socket文件描述符
- backlog:设置同时与服务器连接的上线数
accept 等待并接收连接请求
int accept(int s, struct sockaddr *addr, socklen_t *addrlen);
等待客户端的连接(阻塞等待),成功则返回客户端套接字
参数:
- s:本地socket文件描述符
- addr:传出,与客户端建立连接的地址结构
- addrlen:传入传出,传入addr大小,传出客户端addr实际大小
通信
read/recv 接收数据
ssize_t recv(int sockfd, void *buf, size_t len, int flags);
write/send 发送数据
int send(int s, const void *msg, size_t len, int flags);
关闭
close
connect 客户端连接服务器
int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
参数:
- sockfd:本地socket文件描述符
- addr:服务器的地址结构
- addrlen:addr长度
select
int select(int nfds, fd_set* readfds,fd_set* writefds,fd_set* exceptfds, struct timeval* timeout)
参数
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)
epoll
epoll_create 生成树根节点
int epoll_create(int size);
epoll内部是树结构,该函数生成一个根节点
参数:
epoll_ctl
int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);
用于控制某个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);
委托内核检测哪些描述符要进行I/O操作,返回events中发生变化的个数
参数:
- epfd:epoll树的根节点
- events:传出,结构体数组地址,哪些节点要进行I/O操作
- maxevents:events大小
- timeout:超时时间
|