ZLToolKit 源码分析(七):Socket 网络抽象层封装
2026/6/5 14:04:39 网站建设 项目流程

Socket 是 ZLToolKit 对 TCP/UDP 通信的统一抽象,封装了 fd 生命周期、非阻塞 IO、读写回调、错误处理、发送缓冲等。本文深入到 setsockopt / recv / send 系统调用级别。

1. Socket 类全貌

classSocket:publicstd::enable_shared_from_this<Socket>{public:usingPtr=shared_ptr<Socket>;// 创建 SocketstaticPtrcreateSocket(constEventPoller::Ptr&poller,boolenable_mutex=true);// 连接intconnect(conststring&url,uint16_tport,constonErrCB&on_err,floattimeout_sec=5);// 发送ssize_tsend(constBuffer::Ptr&buf,...);ssize_tsendTo(constBuffer::Ptr&buf,constSockAddress&addr);// 设置回调voidsetOnRead(onReadCB cb);voidsetOnError(onErrCB cb);voidsetOnAccept(onAcceptCB cb);voidsetOnConnect(onConnectCB cb);// 关闭voidshutdown(constSockException&err=...);private:int_sock_fd=-1;EventPoller::Ptr _poller;onReadCB _on_read_cb;onErrCB _on_err_cb;deque<Buffer::Ptr>_send_buf;// 发送缓冲BufferRaw::Ptr _shared_buffer;// 复用缓冲区SockAddress _peer_addr;bool_connected=false;};

2. Socket 创建 — createSocket

Socket::PtrSocket::createSocket(constEventPoller::Ptr&poller,boolenable_mutex){autosock=make_shared<Socket>(poller);intfd=::socket(AF_INET,SOCK_STREAM,0);if(fd<0){throwruntime_error("socket() failed");}sock->setFd(fd,SOCK_STREAM,enable_mutex);returnsock;}

2.1 setFd — fd 初始化

voidSocket::setFd(intfd,intsock_type,boolenable_mutex){_sock_fd=fd;// 非阻塞fcntl(fd,F_SETFL,fcntl(fd,F_GETFL)|O_NONBLOCK);// TCP_NODELAY(禁用 Nagle)if(sock_type==SOCK_STREAM){intopt=1;setsockopt(fd,IPPROTO_TCP,TCP_NODELAY,&opt,sizeof(opt));}// SO_REUSEADDRintopt=1;

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询