免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 7616 | 回复: 14

[C] 写了一个消息队列服务器,欢迎大家吐槽 [复制链接]

论坛徽章:
0
发表于 2013-05-23 15:23 |显示全部楼层
详细可以查看地址:https://github.com/liexusong/mx-queued

论坛徽章:
307
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
发表于 2013-05-23 15:48 |显示全部楼层
下载了,大致看了看,虽然没什么文档,注释也很少,不过还是比较清晰易懂的。
数据好像只在内存,没有持久化机制。
  1. void mx_process_command(mx_connection_t *conn)
  2. {
  3.     char *bline, *eline;
  4.     mx_token_t tokens[MX_MAX_TOKENS];
  5.     int tokens_count;
  6.     mx_command_t *cmd;
  7.     int i, movcnt;

  8. again:
  9.     bline = conn->recvpos;
  10.     eline = memchr(bline, '\n', conn->recvlast - bline);
  11.     if (!eline)
  12.         return;
  13.     conn->recvpos = eline + 1;
  14.     if (eline - bline > 1 && *(eline - 1) == '\r')
  15.         eline--;
  16.     *eline = '\0';

  17.     memset(tokens, 0, sizeof(tokens));  // 这句应该不需要,反正我是不喜欢
  18.    
  19.     tokens_count = mx_tokenize_command(bline, tokens, MX_MAX_TOKENS);
  20.     if (tokens_count == 0) {
  21.         mx_send_reply(conn, "-ERR command invaild");
  22.         return;
  23.     }
  24.    
  25.     cmd = mx_find_command(tokens[0].value, tokens[0].length);
  26.     if (!cmd->name || cmd->argcnt != tokens_count) {
  27.         mx_send_reply(conn, "-ERR command invaild");
  28.         return;
  29.     }
  30.    
  31.     cmd->handler(conn, tokens, tokens_count);
  32.    
  33.     if (conn->recvpos < conn->recvlast) {
  34.         movcnt = conn->recvlast - conn->recvpos;
  35.         memcpy(conn->recvbuf, conn->recvpos, movcnt); // 这里可能有重叠,应该用memmove
  36.         conn->recvpos = conn->recvbuf;
  37.         conn->recvlast = conn->recvbuf + movcnt;
  38.         goto again;
  39.     } else { /* all buffer process finish */
  40.         conn->recvpos = conn->recvbuf;
  41.         conn->recvlast = conn->recvbuf;
  42.     }
  43.     return;
  44. }
复制代码

论坛徽章:
0
发表于 2013-05-23 15:53 |显示全部楼层
回复 2# hellioncu


    谢谢指导

论坛徽章:
11
未羊
日期:2013-12-16 12:45:4615-16赛季CBA联赛之青岛
日期:2016-04-11 19:17:4715-16赛季CBA联赛之广夏
日期:2016-04-06 16:34:012015亚冠之卡尔希纳萨夫
日期:2015-11-10 10:04:522015亚冠之大阪钢巴
日期:2015-07-30 18:29:402015亚冠之城南
日期:2015-06-15 17:56:392015亚冠之卡尔希纳萨夫
日期:2015-05-15 15:19:272015亚冠之山东鲁能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16赛季CBA联赛之八一
日期:2016-07-22 09:41:40
发表于 2013-05-23 16:10 |显示全部楼层
liexusong 发表于 2013-05-23 15:23
详细可以查看地址:https://github.com/liexusong/mx-queued


还不如讲讲思路, 说说为啥快来的实在

论坛徽章:
307
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
发表于 2013-05-23 16:12 |显示全部楼层
liexusong 发表于 2013-05-23 15:53
回复 2# hellioncu


指导不敢当
不过我还是要吐槽

mx_create_connection中

        conn->recvbuf = malloc(MX_RECVBUF_SIZE);
        conn->sendbuf = malloc(MX_SENDBUF_SIZE);

recvbuf和sendbuf都是固定的,也没见地方地方有realloc,为什么不直接定义成

char recvbuf [MX_RECVBUF_SIZE]之类的,这样一个malloc就搞定,不用malloc三次了。

当然如果连接新建和断开很频繁,最好用池。

最后想知道LZ写这个服务器的目的是什么。

论坛徽章:
0
发表于 2013-05-23 16:15 |显示全部楼层
hellioncu 发表于 2013-05-23 16:12
指导不敢当
不过我还是要吐槽


使用malloc的原因是因为我有强烈的代码洁癖,写成数组我觉得很难看(不要鄙视我),另外我写这个服务器是希望自己一直更新下去,直到有一天可以成为一个真正可以让大家认可的东西。

论坛徽章:
307
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
发表于 2013-05-23 16:19 |显示全部楼层
liexusong 发表于 2013-05-23 16:15
使用malloc的原因是因为我有强烈的代码洁癖,写成数组我觉得很难看(不要鄙视我),另外我写这个服务器 ...


服务器不就讲究稳定和高性能么,没了这两点,再漂亮的代码也没用

论坛徽章:
0
发表于 2013-05-24 15:10 |显示全部楼层
还是希望楼主维护一个中文文档, 我可以看文档进行学习交流, 希望楼主多补一些注释吧。

论坛徽章:
2
操作系统版块每日发帖之星
日期:2015-08-05 06:20:0015-16赛季CBA联赛之北控
日期:2019-02-13 22:56:03
发表于 2013-05-24 23:28 |显示全部楼层
我想说,我太懒是来看你们这些 大神华山论剑的

论坛徽章:
0
发表于 2013-05-27 10:01 |显示全部楼层
楼主 如果真的 想继续更新下去的话,你应该把文档什么的 全部整理出来,这样才会更加完美,
支持楼主,在这里!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

SACC2022中国系统架构师大会

2022年1月13日~15日,由IT168旗下ITPUB企业社区平台主办的第十四届中国系统架构师大会(SACC2022)将在云端进行网络直播。承续上届“数字转型 架构重塑”核心主题,按照技术主线分为架构线(传统架构-分布式架构-微服务架构-低代码架构)、运维篇(DevOps、AIOps、高效运维、数据安全等)、金融行业篇、前沿技术篇、大数据篇等,云集国内CTO、研发总监、高级系统架构师、开发工程师和IT经理等技术人群,力争为各路豪杰奉献一场技术的饕餮盛宴。

大会官网
  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP