LIB-ZC, 一个跨平台(Linux)平台通用C/C++扩展库, 网络 socket
- 跨平台
- 命名空间 zcc
方法
网络地址, 例子
192.168.1.1:25
/somepath/someppp/123_domain_socket_path
0:25;127.0.0.1:46;./somepath/123;/home/xxx/111;0:8899
常量
socket 类型
static const char var_tcp_listen_type_inet = 'i';
static const char var_tcp_listen_type_unix = 'u';
static const char var_tcp_listen_type_fifo = 'f';
监听相关
int unix_listen(char *addr, int backlog = 128); // Unix域socket监听
int inet_listen(const char *sip, int port, int backlog = 128); // IP socket监听
int fifo_listen(const char *path); // FIFO监听
int netpath_listen(const char *netpath, int backlog = 128, int *type = nullptr); // 通用路径监听
连接相关
int unix_connect(const char *addr, int timeout); // Unix域socket连接
int inet_connect(const char *dip, int port, int timeout); // IP socket连接
int host_connect(const char *host, int port, int timeout); // 主机名连接
int netpath_connect(const char *netpath, int timeout); // 通用路径连接
接收连接
int unix_accept(int fd); // Unix域socket接收连接
int inet_accept(int fd); // IP socket接收连接
int socket_accept(int fd, int type); // 通用接收连接
关闭连接
// 关闭 fd, 兼容 windows closesocket
int close_socket(int fd);
地址信息
int get_peername(int sockfd, int *host, int *port); // 获取对端地址和端口
带超时连接(connect)的实现原理
- 假设 socket_fd 为connect用的 socket
- 设置 socket_fd 非阻塞, 继续
- 执行 connnect
- 返回 -1 且 errno != EINPROGRESS: 失败, 流程终止
- 否则: 继续
- 超时等待 socket_fd 读写状态
- 可读不可写: 失败, 流程终止
- 可写不可读: 成功, 流程终止
- 可读又可写: 再次执行 connect:
- 返回 -1 且 errno==EISCONN: 成功, 流程终止
- 否则: 失败, 流程终止