{"id":27118395,"url":"https://github.com/suconghou/poll_server","last_synced_at":"2025-04-07T07:57:41.241Z","repository":{"id":282148347,"uuid":"879286665","full_name":"suconghou/poll_server","owner":"suconghou","description":"simple poll server","archived":false,"fork":false,"pushed_at":"2025-03-22T08:54:55.000Z","size":60,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-03-22T09:28:17.355Z","etag":null,"topics":["async","epoll","event-loop","networking","non-blocking","poll","poll-server","poll-socket","select","socket","socket-programming","tcp-server"],"latest_commit_sha":null,"homepage":"","language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/suconghou.png","metadata":{"files":{"readme":"README.MD","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-10-27T14:09:51.000Z","updated_at":"2025-03-22T08:54:59.000Z","dependencies_parsed_at":"2025-03-13T03:29:29.655Z","dependency_job_id":null,"html_url":"https://github.com/suconghou/poll_server","commit_stats":null,"previous_names":["suconghou/poll_server"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/suconghou%2Fpoll_server","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/suconghou%2Fpoll_server/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/suconghou%2Fpoll_server/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/suconghou%2Fpoll_server/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/suconghou","download_url":"https://codeload.github.com/suconghou/poll_server/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247615474,"owners_count":20967183,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["async","epoll","event-loop","networking","non-blocking","poll","poll-server","poll-socket","select","socket","socket-programming","tcp-server"],"created_at":"2025-04-07T07:57:40.630Z","updated_at":"2025-04-07T07:57:41.230Z","avatar_url":"https://github.com/suconghou.png","language":"C++","readme":"## poll_server\n\n使用`poll`API实现的单线程异步IO SERVER框架\n\n\nmain.cpp 为一个 redis server 示例\n\n\n```\ng++ -Wall -std=c++20 -O1 main.cpp\n```\n\n```\ng++ -Wall -std=c++20 -flto=auto -static-libstdc++ -static-libgcc --static -Wl,-Bstatic,--gc-sections -O3 -ffunction-sections -fdata-sections main.cpp -o redisserver\n```\n\nAPI 设计\n\n### 构造函数参数\n\n**on_loop**\n\n事件循环持续调用时一直触发，调用此函数携带两个参数： self引用，当前fd活跃个数（包含server的fd）\n\n函数需返回一个数字，代表事件循环检测的超时时间，单位毫秒，这使得单线程程序仍然有机会执行一些外部任务\n\n如果需要在此执行一些简单的外部任务，一般可以配置为1000-5000；如果不需要可以配置的更长\n\n当返回值小于1时，代表意图中断事件循环\n\n**on_open**\n\n当成功`accept`后，回调此函数，并携带参数此链接的`fd`\n\n当系统连接数超过限制（128）后，回调此函数携带的`fd`为-1，代表连接数已满，新链接被关闭\n\n**on_data**\n\n当有数据到达时，回调此函数，并携带参数此链接的`fd`和数据指针，数据长度\n\n调用方必须判断数据长度大于0，才能读取数据buffer；系统保证每次回调携带的数据不超过64KB\n\n数据长度为0，代表业务主动调用了关闭函数\n\n数据长度为-1，代表事件循环收到链接中断（POLLHUP事件）\n\n数据长度为-2，代表send返回=0，对方关闭连接\n\n数据长度为-3，代表send返回\u003c0，可能是 EPIPE 等错误\n\n数据长度为-4，代表recv返回\u003c0，可能是 ECONNRESET，EBADF 等错误\n\n数据长度为-5，代表POLLERR或POLLNVAL 事件\n\n数据长度为-10，代表先收到了recv返回=0，客户端可能处于半连接状态，我方发送完数据后关闭连接\n\n### 数据发送\n\n使用`write`函数提交一个数据发送请求，参数`fd`,发送的数据，回调函数\n若传入的数据0字节，则忽略此发送请求\n\n回调函数回调有三个参数：self引用，操作的`fd`, 发送的字节数\n\n发送成功时执行回调函数,此字节数等于提交任务时传入数据的字节数\n\n发送失败时，可能链接被关闭将触发on_data回调，本回调不在执行\n\n### 链接关闭\n\n在任意回调函数里，可直接使用成员方法`closefd`直接关闭`fd`\n\n\n## 性能测试\n\n\n使用`redis-benchmark -p 6479 set a b`测试\n\n性能与原版redis性能差不多\n\n```\n====== set a b ======\n  100000 requests completed in 3.78 seconds\n  50 parallel clients\n  3 bytes payload\n  keep alive: 1\n\n36.56% \u003c= 1 milliseconds\n99.83% \u003c= 2 milliseconds\n99.99% \u003c= 3 milliseconds\n100.00% \u003c= 3 milliseconds\n26448.03 requests per second\n```\n\n## 其他\n\n基于本项目封装的http server库 https://github.com/suconghou/httplib\n\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsuconghou%2Fpoll_server","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsuconghou%2Fpoll_server","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsuconghou%2Fpoll_server/lists"}