﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-sh19871122-随笔分类-网络</title><link>http://www.cppblog.com/sh19871122/category/20668.html</link><description /><language>zh-cn</language><lastBuildDate>Thu, 20 Mar 2014 04:57:13 GMT</lastBuildDate><pubDate>Thu, 20 Mar 2014 04:57:13 GMT</pubDate><ttl>60</ttl><item><title>zeromq学习，第一章</title><link>http://www.cppblog.com/sh19871122/archive/2014/03/16/206194.html</link><dc:creator>Hallelujah</dc:creator><author>Hallelujah</author><pubDate>Sun, 16 Mar 2014 15:41:00 GMT</pubDate><guid>http://www.cppblog.com/sh19871122/archive/2014/03/16/206194.html</guid><wfw:comment>http://www.cppblog.com/sh19871122/comments/206194.html</wfw:comment><comments>http://www.cppblog.com/sh19871122/archive/2014/03/16/206194.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/sh19871122/comments/commentRss/206194.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/sh19871122/services/trackbacks/206194.html</trackback:ping><description><![CDATA[Asynchronous Input/Output（AIO）：AIO可以在input/output的请求到来之前继续执行。AIO在实时应用程序中是必须的。使用AIO可以映射多个任务到一个线程上去。<br />首先zeromq的设计是弱中间人的（brokerless，相对于ActiveMQ、RabbitMQ等,使用0zq的程序就可以直接和其他的节点通信而不通过broker的代理。），zeromq不会存储信息到磁盘上，然而可能使用本地的交换文件来存储消息（当设置了zmq.SWAP时）。<br /><br />示例：HelloWorld（server）<br /> <br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><img id="Code_Closed_Image_230816" onclick="this.style.display='none'; Code_Closed_Text_230816.style.display='none'; Code_Open_Image_230816.style.display='inline'; Code_Open_Text_230816.style.display='inline';" height="16" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" width="11" align="top"><img id="Code_Open_Image_230816" style="display: none" onclick="this.style.display='none'; Code_Open_Text_230816.style.display='none'; Code_Closed_Image_230816.style.display='inline'; Code_Closed_Text_230816.style.display='inline';" height="16" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" width="11" align="top"><span id="Code_Closed_Text_230816" style="border-right: #808080 1px solid; border-top: #808080 1px solid; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">server</span><span id="Code_Open_Text_230816" style="display: none"><br /><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><br />#include&nbsp;&lt;<span style="color: #0000FF; ">string</span>.h&gt;<br />#include&nbsp;&lt;stdio.h&gt;<br />#include&nbsp;&lt;unistd.h&gt;<br />#include&nbsp;&lt;zmq.h&gt;<br /><br /><span style="color: #0000FF; ">int</span>&nbsp;main(<span style="color: #0000FF; ">int</span>&nbsp;argc,&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;*argv[])<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;*context&nbsp;=&nbsp;zmq_ctx_new();<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;*respond&nbsp;=&nbsp;zmq_socket(context,&nbsp;ZMQ_REQ);<br />&nbsp;&nbsp;&nbsp;&nbsp;zmq_bind(respond,&nbsp;"tcp://*:4040");<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;printf("starting<img src="http://www.cppblog.com/Images/dot.gif"  alt="" />\n");<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(;;)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;zmq_msg_t&nbsp;request;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;zmq_msg_init(&amp;request);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;zmq_msg_recv(&amp;request,&nbsp;respond,&nbsp;0);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("received:&nbsp;%s\n",&nbsp;zmq_msg_data(&amp;request));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;zmq_msg_close(&amp;request);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sleep(1);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;zmq_msg_t&nbsp;reply;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;zmq_msg_init_size(&amp;reply,&nbsp;strlen("world"));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memcpy(zmq_msg_data(&amp;reply),&nbsp;"world",&nbsp;5);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;zmq_msg_send(&amp;reply,&nbsp;respond,&nbsp;0);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;zmq_msg_close(&amp;reply);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;zmq_close(respond);<br />&nbsp;&nbsp;&nbsp;&nbsp;zmq_ctx_destroy(context);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br /></span></div><br />示例：Helloworld（client）<br /><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><img id="Code_Closed_Image_230951" onclick="this.style.display='none'; Code_Closed_Text_230951.style.display='none'; Code_Open_Image_230951.style.display='inline'; Code_Open_Text_230951.style.display='inline';" height="16" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" width="11" align="top"><img id="Code_Open_Image_230951" style="display: none" onclick="this.style.display='none'; Code_Open_Text_230951.style.display='none'; Code_Closed_Image_230951.style.display='inline'; Code_Closed_Text_230951.style.display='inline';" height="16" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" width="11" align="top"><span id="Code_Closed_Text_230951" style="border-right: #808080 1px solid; border-top: #808080 1px solid; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">client</span><span id="Code_Open_Text_230951" style="display: none"><br /><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;2</span>&nbsp;#include&nbsp;&lt;stdio.h&gt;<br /><span style="color: #008080; ">&nbsp;3</span>&nbsp;#include&nbsp;&lt;unistd.h&gt;<br /><span style="color: #008080; ">&nbsp;4</span>&nbsp;#include&nbsp;&lt;<span style="color: #0000FF; ">string</span>.h&gt;<br /><span style="color: #008080; ">&nbsp;5</span>&nbsp;#include&nbsp;&lt;zmq.h&gt;<br /><span style="color: #008080; ">&nbsp;6</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;7</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;main(<span style="color: #0000FF; ">int</span>&nbsp;argc,&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;*argv[])<br /><span style="color: #008080; ">&nbsp;8</span>&nbsp;{<br /><span style="color: #008080; ">&nbsp;9</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;*context&nbsp;=&nbsp;zmq_ctx_new();<br /><span style="color: #008080; ">10</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("client&nbsp;starting<img src="http://www.cppblog.com/Images/dot.gif"  alt="" />\n");<br /><span style="color: #008080; ">11</span>&nbsp;<br /><span style="color: #008080; ">12</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;*request&nbsp;=&nbsp;zmq_socket(context,&nbsp;ZMQ_REQ);<br /><span style="color: #008080; ">13</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;zmq_connect(request,&nbsp;"tcp://localhost:4040");<br /><span style="color: #008080; ">14</span>&nbsp;<br /><span style="color: #008080; ">15</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;count&nbsp;=&nbsp;0;<br /><span style="color: #008080; ">16</span>&nbsp;<br /><span style="color: #008080; ">17</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(;;)<br /><span style="color: #008080; ">18</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /><span style="color: #008080; ">19</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;zmq_msg_t&nbsp;req;<br /><span style="color: #008080; ">20</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;zmq_msg_init_size(&amp;req,&nbsp;strlen("hello"));<br /><span style="color: #008080; ">21</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memcpy(zmq_msg_data(&amp;req),&nbsp;"hello",&nbsp;5);<br /><span style="color: #008080; ">22</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("send&nbsp;msg&nbsp;hello,&nbsp;count&nbsp;=&nbsp;%d\n",&nbsp;count);<br /><span style="color: #008080; ">23</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;zmq_msg_send(&amp;req,&nbsp;request,&nbsp;0);<br /><span style="color: #008080; ">24</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;zmq_msg_close(&amp;req);<br /><span style="color: #008080; ">25</span>&nbsp;<br /><span style="color: #008080; ">26</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;zmq_msg_t&nbsp;reply;<br /><span style="color: #008080; ">27</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;zmq_msg_init(&amp;reply);<br /><span style="color: #008080; ">28</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;zmq_msg_recv(&amp;reply,&nbsp;request,&nbsp;0);<br /><span style="color: #008080; ">29</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("recv&nbsp;msg&nbsp;%s,&nbsp;count&nbsp;=&nbsp;%d\n",&nbsp;zmq_msg_data(&amp;reply),&nbsp;count);<br /><span style="color: #008080; ">30</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;zmq_msg_close(&amp;reply);<br /><span style="color: #008080; ">31</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;count++;<br /><span style="color: #008080; ">32</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">33</span>&nbsp;<br /><span style="color: #008080; ">34</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;zmq_close(request);<br /><span style="color: #008080; ">35</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;zmq_ctx_destroy(context);<br /><span style="color: #008080; ">36</span>&nbsp;<br /><span style="color: #008080; ">37</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br /><span style="color: #008080; ">38</span>&nbsp;}<br /><span style="color: #008080; ">39</span>&nbsp;<br /><span style="color: #008080; ">40</span>&nbsp;</span></div><br />这里使用了最基本的请求应答架构。详细解析代码：<br />第一步：创建了context和socket，zmq_ctx_new方法创建了一个新的<span style="color: red;">context，这是线程安全</span>的，即一个context可用于多个线程操作。 zmq_socket方法创建了一个在context中定义的socket，<span style="color: red;">ZeroMQ的socket不是线程安全</span>。传统的socket是同步的，然而ZMQ的socket在客户端和服务端都维护了一个队列来管理request-reply的异步模式。ZMQ自动的处理连接、重连、断开连接和内容交付。<br />服务端创建了Reply（ZMQ_REP）用来处理接收消息并应答消息。如果客户端和服务端遗失（lost），应答的消息将在没有任何通知的情况下丢掉。<br />客户端创建了一个Request(ZMQ_REQ)来发送消息并接收来自服务的应答。ZMQ_REQ下不会丢弃任何信息，不管是没有没有可用与发送消息的服务或是服务处于忙状态，所有的发送操作zmq_send函数会阻塞，直到一个服务变为可用于发送消息。ZMQ_REQ和ZMQ_REP、ZMQ_ROUTER类型兼容。<br />消息的发送zmq_send函数的第三个参数是flags，是ZMQ_DONTWAIT或ZMQ_SNDMORE。ZMQ_DONTWAIT表明消息是异步的发送。ZMQ_SNDMORE表明消息有多部分，其余的部分已经&#8220;在路上了&#8221;。消息接收函数zmq_msg_recv函数，如服务端，在先前接收的消息是无效的。第三个参数flugs可能是ZMQ_DONTWAIT。<br /><br />先睡觉了<img src ="http://www.cppblog.com/sh19871122/aggbug/206194.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/sh19871122/" target="_blank">Hallelujah</a> 2014-03-16 23:41 <a href="http://www.cppblog.com/sh19871122/archive/2014/03/16/206194.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>