免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1768 | 回复: 6
打印 上一主题 下一主题

请大家讨论一下如何同步两个异地进程 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-07-14 17:07 |只看该作者 |倒序浏览
我现在的做法是,创建一个单独的线程,然后通过socket的send/recv来发送/接收一些整数,代码如下:

  1. 2355 static int cma_remsync_send(node_t *node, sync_no_t sync_no)
  2. 2356 {
  3. 2357         int                     ret;
  4. 2358
  5. 2359         ret = send(test->conn_sock, (void *)&sync_no, sizeof (sync_no_t), 0);
  6. 2360         if (ret < 0) {
  7. 2361                 ERROR("cma_remsync_send: send sync_no failed %s (%d)\n",
  8. 2362                     strerror(errno), errno);
  9. 2363                 return 1;
  10. 2364         }
  11. 2365
  12. 2366         return 0;
  13. 2367 }
  14. 2368
  15. 2369 static int cma_remsync_recv(node_t *node, sync_no_t sync_no)
  16. 2370 {
  17. 2371         int                     ret;
  18. 2372         sync_no_t               rsync_no = SYNC_NONE;
  19. 2373
  20. 2374         ret = recv(test->conn_sock, (void *)&rsync_no, sizeof (sync_no_t), 0);
  21. 2375         if (ret < 0) {
  22. 2376                 ERROR("cma_remsync_recv: recv sync_no failed %s (%d)\n",
  23. 2377                     strerror(errno), errno);
  24. 2378                 return 1;
  25. 2379         }
  26. 2380
  27. 2381         if (rsync_no != sync_no) {
  28. 2382                 ERROR("cma_remsync_recv: recv'd sync_no (%d) isn't as expected "
  29. 2383                     "(%d)\n", rsync_no, sync_no);
  30. 2384                 return 1;
  31. 2385         }
  32. 2386
  33. 2387         return 0;
  34. 2388 }
  35. 2389
  36. 2390 int cma_remsync(node_t *node, sync_no_t no)
  37. 2391 {
  38. 2392         sync_no_t               sync_no = no;
  39. 2393         int                     errors = 0;
  40. 2394
  41. 2395         if (test->cm_test_type == CM_TEST_SERVER) {
  42. 2396                 errors += cma_remsync_send(node, sync_no);
  43. 2397                 errors += cma_remsync_recv(node, sync_no);
  44. 2398         } else {
  45. 2399                 errors += cma_remsync_recv(node, sync_no);
  46. 2400                 errors += cma_remsync_send(node, sync_no);
  47. 2401         }
  48. 2402
  49. 2403         return errors;
  50. 2404 }

复制代码

sync_no_t是我定义的一组枚举变量。

但是我觉得实现不太好,首先很明显的就是客户端必须先到达各个同步点,否则服务器端的send就会失败;另外recv应该也会有个超时的问题吧。

希望大家能指点一下,如何完善上面这个函数,越简单越好。

如果觉得我这个实现方案就不对,那有没有更好的实现方法呢,或者现成的库函数(不能额外安装包)

[ 本帖最后由 wawxdyy 于 2009-7-14 18:36 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2009-07-14 17:08 |只看该作者
奇怪啊,怎么<code></code>不好用啊

论坛徽章:
0
3 [报告]
发表于 2009-07-14 18:32 |只看该作者
原帖由 wawxdyy 于 2009-7-14 17:08 发表
奇怪啊,怎么<code></code>不好用啊

把尖角磨平了就好用了

论坛徽章:
0
4 [报告]
发表于 2009-07-14 18:37 |只看该作者

回复 #3 swxlion 的帖子

果然,谢啦,我忘掉了

论坛徽章:
0
5 [报告]
发表于 2009-07-14 19:35 |只看该作者
如果怕超时或发送失败的话,可以用UDP来试一下,但有个问题,UDP不可靠,有可能丢数据包,因此得进行超时重发,否则进程会一直在那挂到22世纪

论坛徽章:
0
6 [报告]
发表于 2009-07-15 15:16 |只看该作者
看了半天不知道LZ同步是指什么.
>>>客户端必须先到达各个同步点

论坛徽章:
0
7 [报告]
发表于 2009-07-15 17:31 |只看该作者
同步长连接、同步短连接?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP