纯C实现的LED点阵动态显示方案:桌面仿真+4级软件调光,兼容STM32/ESP32/EFM32
2026/6/5 16:46:57
Socket 是 ZLToolKit 对 TCP/UDP 通信的统一抽象,封装了 fd 生命周期、非阻塞 IO、读写回调、错误处理、发送缓冲等。本文深入到 setsockopt / recv / send 系统调用级别。
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;};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;}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;