{"id":3306,"date":"2014-01-11T08:30:04","date_gmt":"2014-01-10T23:30:04","guid":{"rendered":"http:\/\/pchero21.com\/?p=3007"},"modified":"2014-01-11T08:30:04","modified_gmt":"2014-01-10T23:30:04","slug":"zeromq-1","status":"publish","type":"post","link":"http:\/\/pchero21.com\/?p=3306","title":{"rendered":"ZeroMQ &#8211; 1"},"content":{"rendered":"<p>ZeroMQ \ub294 \ub124\ud2b8\uc6cc\ud06c \uc18c\ucf13 \uad00\ub9ac\ub97c \uc704\ud55c \ub77c\uc774\ube0c\ub7ec\ub9ac\uc774\ub2e4.<\/p>\n<p>\uc774\ubc88 \ud504\ub85c\uc81d\ud2b8\ub97c \uc9c4\ud589\ud558\uba74\uc11c Libevent + ZeroMQ \ub97c \uc0ac\uc6a9\ud558\uac8c \ub418\uc5c8\ub294\ub370 \ub108\ubb34 \ud6a8\uacfc\uac00 \uc88b\uc544\uc11c \uadf8 \ub0b4\uc6a9\uc744 \uc815\ub9ac\ud55c\ub2e4.<\/p>\n<p>\uc774\uacf3\uc5d0 \uc62c\ub824\uc9c4 \ubaa8\ub4e0 ZeroMQ \uad00\ub828 \ub0b4\uc6a9\uc740 \ubaa8\ub450 zguide.zeromq.org \uc5d0 \uc788\ub294 \ub0b4\uc6a9\uc744 \ubc14\ud0d5\uc73c\ub85c \uc815\ub9ac\ud574 \ub193\uc740 \uac83\uc774\uba70, \ubaa8\ub4e0 \uc6d0\ubb38 \ub0b4\uc6a9\uc740 \ud574\ub2f9 \uc0ac\uc774\ud2b8\uc5d0\uc11c \ubb34\ub8cc\ub85c \ubcfc \uc218 \uc788\ub2e4.<\/p>\n<p>\ubaa8\ub4e0 \ub0b4\uc6a9\uc740 C \ub97c \uae30\ubc18\uc73c\ub85c \uc791\uc131\ub418\uba70, \ub2e4\ub978 \uc5b8\uc5b4\uc758 \uacbd\uc6b0, \ub9c8\ucc2c\uac00\uc9c0\ub85c \ud574\ub2f9 \uc0ac\uc774\ud2b8\uc5d0\uc11c \ud655\uc778\ud560 \uc218 \uc788\ub2e4.<\/p>\n<p>\uba3c\uc800 ZeroMQ\ub97c \uc124\uce58\ud558\uc790.<\/p>\n<p>ZeroMQ \uc124\uce58\ub294 \uac04\ub2e8\ud558\ub2e4. Ubuntu \uc758 \uacbd\uc6b0, \ub2e4\uc74c\uc758 \uba85\ub839\uc5b4\ub97c \uc785\ub825\ud558\uba74 \ub41c\ub2e4.<\/p>\n<blockquote><p>$ sudo apt-get install libzmq<\/p><\/blockquote>\n<p>\ub77c\uc774\ube0c\ub7ec\ub9ac \uc124\uce58\uac00 \uc644\ub8cc\ub418\uc5c8\uc73c\uba74 \uace7\ubc14\ub85c \uc608\uc81c \ud504\ub85c\uadf8\ub7a8\uc744 \uc791\uc131\ud574\ubcf4\uc790.<\/p>\n<p>\uc608\uc81c \ud504\ub85c\uadf8\ub7a8\uc740 \ub2f9\uc5f0\ud788 Hello world \ud504\ub85c\uadf8\ub7a8\uc774\ub2e4.<\/p>\n<p>\ub450 \uac1c\uc758 \ud504\ub85c\uadf8\ub7a8\uc744 \uc791\uc131\ud55c\ub2e4.&nbsp; Server\/Client.<\/p>\n<p>server \uc640 client\ub294 \uc11c\ub85c tcp\/ip \ub85c \ud1b5\uc2e0\ud558\uba70, server \ub294 \ud504\ub85c\uadf8\ub7a8\uc744 \uc2dc\uc791\ud558\uba74 client \uc758 \uc811\uc18d\uc744 \uae30\ub2e4\ub9b0\ub2e4. \uc774\ud6c4, client \uac00 \ub3d9\uc791\ud558\uba74 \uace7\ubc14\ub85c server \ub85c \uc811\uc18d\uc744 \uc2dc\ub3c4\ud55c\ub2e4.<\/p>\n<p>client \uac00 server \uc811\uc18d\uc744 \ud558\uba74, &#8220;Hello&#8221; \uba54\uc2dc\uc9c0\ub97c \uc1a1\uc2e0\ud558\uba70, server \ub294 \uba54\uc2dc\uc9c0 \uc218\uc2e0 \uc774\ud6c4, &#8220;World&#8221;\ub77c\ub294 \uc751\ub2f5\uc744 \ubcf4\ub0b8\ub2e4.<\/p>\n<p>main.c<br \/>\n<code lang=\"c[lines-notools]\">#include <zmq.h><br \/>\n#include <stdio.h><br \/>\n#include <unistd.h><br \/>\n#include <string.h><br \/>\n#include <assert.h><\/p>\n<p>int main(int argc, char** argv)<br \/>\n{<br \/>\n    \/\/ Socket to talk to clients<br \/>\n    void* context = zmq_ctx_new();<br \/>\n    void* responder = zmq_socket(context, ZMQ_REP);<br \/>\n    int rc = zmq_bind(responder, \"tcp:\/\/*:5555\");<br \/>\n    assert(rc == 0);<\/p>\n<p>    while(1)<br \/>\n    {<br \/>\n        char buffer[10];<br \/>\n        zmq_recv(responder, buffer, 10, 0);<br \/>\n        printf(\"Received Hellon\");<br \/>\n        sleep(1);   \/\/ Do some 'work'<br \/>\n        zmq_send(responder, \"World\", 5, 0);<br \/>\n    }<\/p>\n<p>    return 0;<br \/>\n}<\/code><\/p>\n<p>Client \ub3c4 \uc791\uc131\ud574 \uc8fc\uc790.<\/p>\n<p>main.c<\/p>\n<p><code lang=\"c[lines-notools]\"><br \/>\n\/\/ Hello World client<br \/>\n#include <zmq.h><br \/>\n#include <string.h><br \/>\n#include <stdio.h><br \/>\n#include <unistd.h><\/p>\n<p>int main(int argc, char **argv)<br \/>\n{<br \/>\n    printf(\"Connecting to hello world server...n\");<br \/>\n    void* context   = zmq_ctx_new();<br \/>\n    void* requester = zmq_socket(context, ZMQ_REQ);<br \/>\n    zmq_connect(requester, \"tcp:\/\/localhost:5555\");<\/p>\n<p>    int request_nbr;<br \/>\n    for(request_nbr = 0; request_nbr != 10; request_nbr++)<br \/>\n    {<br \/>\n        char buffer[10];<br \/>\n        printf(\"Sending Hello %d...n\", request_nbr);<br \/>\n        zmq_send(requester, \"Hello\", 5, 0);<br \/>\n        zmq_recv(requester, buffer, 10, 0);<br \/>\n        printf(\"Received World %dn\", request_nbr);<br \/>\n    }<\/p>\n<p>    zmq_close(requester);<br \/>\n    zmq_ctx_destroy(context);<\/p>\n<p>    return 0;<br \/>\n}<br \/>\n<\/code><\/p>\n<p>\uc790, \uc774\uc81c \uc11c\ubc84\ub97c \uba3c\uc800 \uc2e4\ud589\ud558\uace0, Client \ub97c \uc2e4\ud589\ud574\ubcf4\uc790.<\/p>\n<p>Server \uc2e4\ud589 \uacb0\uacfc<\/p>\n<blockquote><p>Received Hello<\/p>\n<p>Received Hello<\/p>\n<p>Received Hello<\/p>\n<p>Received Hello<\/p>\n<p>Received Hello<\/p>\n<p>Received Hello<\/p>\n<p>Received Hello<\/p>\n<p>Received Hello<\/p>\n<p>Received Hello<\/p>\n<p>Received Hello<\/p><\/blockquote>\n<p>Client \uc2e4\ud589 \uacb0\uacfc<\/p>\n<blockquote><p>Connecting to hello world server&#8230;<\/p>\n<p>Sending Hello 0&#8230;<\/p>\n<p>Received World 0<\/p>\n<p>Sending Hello 1&#8230;<\/p>\n<p>Received World 1<\/p>\n<p>Sending Hello 2&#8230;<\/p>\n<p>Received World 2<\/p>\n<p>Sending Hello 3&#8230;<\/p>\n<p>Received World 3<\/p>\n<p>Sending Hello 4&#8230;<\/p>\n<p>Received World 4<\/p>\n<p>Sending Hello 5&#8230;<\/p>\n<p>Received World 5<\/p>\n<p>Sending Hello 6&#8230;<\/p>\n<p>Received World 6<\/p>\n<p>Sending Hello 7&#8230;<\/p>\n<p>Received World 7<\/p>\n<p>Sending Hello 8&#8230;<\/p>\n<p>Received World 8<\/p>\n<p>Sending Hello 9&#8230;<\/p>\n<p>Received World 9<\/p><\/blockquote>\n<p>\uc790, \uc774\uc81c \ub0b4\uc6a9\uc744 \uc0b4\ud3b4\ubcf4\uc790. \ubb34\uc2a8\uc77c\uc774 \uc77c\uc5b4\ub0ac\ub358 \uac83\uc77c\uae4c?<\/p>\n<p>ZeroMQ \uc5d0\uc11c \uc0ac\uc6a9\ub418\ub294 \ubaa8\ub4e0 \uc18c\ucf13 \uc5f0\uacb0\uc740 \ud328\ud134\uc73c\ub85c \uacb0\ud569\ub41c\ub2e4.<\/p>\n<p>\ud328\ud134\uc774\ub780, \uc6b0\ub9ac\uac00 \ud754\ud788 \uc0ac\uc6a9\ud558\ub294 \uc18c\ucf13\uc744 \uc774\uc6a9\ud55c \ub370\uc774\ud130 \uc804\uc1a1 \ubc29\uc2dd\uc744 \uba87\uac00\uc9c0\uc758 \uadf8\ub8f9\uc73c\ub85c \ub098\ub258\uc5b4 \ub193\uc740 \uac83\uc744 \uc774\uc57c\uae30\ud55c\ub2e4.<\/p>\n<p>\ud55c\uac00\uc9c0 \uc608\ub97c \ub4e4\uba74, \ud754\ud788, \uc6b0\ub9ac\uac00 \ub124\ud2b8\uc6cc\ud06c \ud504\ub85c\uadf8\ub798\ubc0d\uc744 \ud55c\ub2e4\uba74 client \uac00 \uc694\uccad\ud558\uace0 server \uc751\ub2f5\ud558\ub294 \ubc29\uc2dd\uc744 \uc0dd\uac01\ud55c\ub2e4.<\/p>\n<p>\uc989, client\uac00 \uba3c\uc800 \uc9c8\uc758(Request)\ud558\uace0, server\uac00 \uc751\ub2f5(reply)\ud558\ub294 \ubc29\uc2dd\uc778\ub370, \uc774\ub97c Request-Reply \ud328\ud134\uc774\ub77c \ud55c\ub2e4.<\/p>\n<p><strong>REQ-REP<\/strong><\/p>\n<p style=\"text-align: center;\"><img loading=\"lazy\" class=\"aligncenter  wp-image-3013\" alt=\"fig2\" src=\"http:\/\/pchero21.com\/wp-content\/uploads\/2014\/01\/fig211.png\" width=\"162\" height=\"256\" \/><\/p>\n<p>REQ-REP \uc18c\ucf13 \uc5f0\uacb0\uc740 \uad49\uc7a5\ud788 \uc5c4\uaca9\ud55c \ud1b5\uc2e0 \ubc29\uc2dd\uc774\ub2e4. Client while \ub8e8\ud504 \uc548\uc5d0\uc11c zmq_send() \ub97c \ud638\ucd9c\ud558\uace0 zmq_recv \ub97c \ud638\ucd9c\ud55c\ub2e4.<\/p>\n<p>\ub9cc\uc57d, zmq_send() \uc640 zmq_recv \uc0ac\uc774\uc5d0 \ub2e4\ub978 \uc5b4\ub5a4 Sequence(\uc608\ub97c \ub4e4\uc5b4 zmq_send() \ub97c \ud55c\ubc88 \ub354 \ud638\ucd9c\ud55c\ub2e4\ub358\uc9c0..)\ud558\uac8c \ub418\uba74 \ud574\ub2f9 \ud638\ucd9c \uacb0\uacfc\ub294 \uc5d0\ub7ec\ucc98\ub9ac\ub420 \uac83\uc774\ub2e4.<\/p>\n<p>Server \uc5ed\uc2dc \ub9c8\ucc2c\uac00\uc9c0\ub85c, \ub9cc\uc57d zmq_recv \uc640 zmq_send \uc0ac\uc774\uc5d0 \ub2e4\ub978 Sequence \ub97c \uc9c4\ud589\ud558\uac8c \ub418\uba74, \uc5d0\ub7ec\ub85c \ucc98\ub9ac\ub41c\ub2e4.<\/p>\n<p>\ubcf4\ud1b5\uc758 \uc18c\ucf13 \ud504\ub85c\uadf8\ub7a8\uc5d0\uc11c Server \ubcf4\ub2e4 Client \uac00 \uba3c\uc800 \uc2e4\ud589\ub420 \uacbd\uc6b0, \uc5b4\ub5a4 \ud604\uc0c1\uc774 \ub098\ud0c0\ub098\uac8c \ub420\uc9c0 \uc0dd\uac01\ud574\ubcf4\uc790. \uadf8\ub9ac\uace0 \ud55c\ubc88 \uc704\uc758 \uc608\uc81c\ub97c client \ubd80\ud130 \uc2e4\ud589\uc744 \ud574\ubcf4\uc790.<\/p>\n<p>\uc5b4\ub5bb\uac8c \ub418\ub294\uac00? \ud83d\ude42<\/p>\n<p><strong>ZeroMQ String<\/strong><\/p>\n<p>ZeroMQ\ub294 \uc624\uc9c1 \uc804\uc1a1\ub418\ub294 \ub370\uc774\ud130\uc758 \uc0ac\uc774\uc988\ub9cc \ud655\uc778\ud55c\ub2e4. \uc774 \ub9d0\uc740 \uc5b4\ub5a4 \ub370\uc774\ud130 \ud615\uc2dd\uc774\ub77c\ub3c4 OK \uc774\uc9c0\ub9cc, \ub370\uc774\ud130 \uad00\ub9ac\ub294 \uac1c\ubc1c\uc790 \uc2a4\uc2a4\ub85c\uac00 \ud574\uc57c \ud55c\ub2e4\ub294 \uac83\uc774\ub2e4.<\/p>\n<p>\uac00\uc7a5 \ub300\ud45c\uc801\uc778 \uc608\ub85c String \uacfc \uad00\ub828\ub41c \ud2b9\uc9d5\uc774 \uc788\ub2e4.<\/p>\n<p>\ub2e4\uc74c\uc744 \uc0dd\uac01\ud574\ubcf4\uc790.<\/p>\n<p>\ub9cc\uc57d C \uc5d0\uc11c NULL \ubc14\uc774\ud2b8\ub85c \uc885\ub8cc\ub418\ub294 \ubb38\uc790\uc5f4\uc744 \uc804\uc1a1\ud55c\ub2e4\uace0 \ud55c\ub2e4\uba74, \uc544\ub9c8 \ub2e4\uc74c\uacfc \uac19\uc774 \uc785\ub825\ud560 \uc218 \uc788\uc744 \uac83\uc774\ub2e4.<\/p>\n<blockquote><p>zmq_send(requester, &#8220;Hello&#8221;, 6, 0);<\/p><\/blockquote>\n<p>\ud558\uc9c0\ub9cc \ub9cc\uc57d \ub2e4\ub978 \uc5b8\uc5b4\uc5d0\uc11c\ub77c\uba74 \ub2e4\ub974\uac8c \uc785\ub825\ub41c \uac83\uc774\ub2e4. Python \uc744 \uc608\ub85c \ub4e4\uc5b4\ubcf4\uc790.<\/p>\n<blockquote><p>socket.send(&#8220;Hello&#8221;)<\/p><\/blockquote>\n<p>\uc774\ub7f0 \uacbd\uc6b0(Python\uc758 \uacbd\uc6b0), \uc2e4\uc81c\ub85c \uc804\uc1a1\ub418\ub294 \ub370\uc774\ud130\uc758 \ub0b4\uc6a9\uc740 \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n<p>\uadf8\ub9ac\uace0, \ub9cc\uc57d C \ud504\ub85c\uadf8\ub7a8\uc5d0\uc11c \uc774\ub97c \uc218\uc2e0\ud558\uac8c \ub41c\ub2e4\uba74, \uc544\ub9c8\ub3c4 String \uc73c\ub85c \ubcf4\uc5ec\uc9c0\uac8c \ub420 \uac83\uc774\ub2e4. \ud558\uc9c0\ub9cc, \uc704\uc758 \uadf8\ub9bc\uc5d0\uc11c \ubcf4\ub4ef\uc774 \ubb38\uc790\uc5f4 \uc885\ub8cc \uad6c\ubd84\uc790(NULL)\uac00 \uc5c6\ub2e4.<\/p>\n<p>\uc774\ub294 \uc0ac\uc6a9\uc790\uac00 ZeroMQ \ub97c \ud1b5\ud558\uc5ec \ub370\uc774\ud130\ub97c \uc1a1\/\uc218\uc2e0\ud560 \ub54c\ub294 Server\/Client \uac00 \ub370\uc774\ud130 \ud615\uc2dd\uc5d0 \uc8fc\uc758\ub97c \uae30\uc6b8\uc5ec\uc57c \ud568\uc744 \ub73b\ud55c\ub2e4.<\/p>\n<p><a href=\"http:\/\/pchero21.com\/wp-content\/uploads\/2014\/01\/fig311.png\"><img loading=\"lazy\" class=\"aligncenter  wp-image-3015\" alt=\"fig3\" src=\"http:\/\/pchero21.com\/wp-content\/uploads\/2014\/01\/fig311.png\" width=\"360\" height=\"64\" \/><\/a>\uadf8\ub807\ub2e4\uba74, ZeroMQ \uc5d0\uc11c String \ubb38\uc790\uc5f4\uc744 \ubc1b\uae30 \uc704\ud574\uc11c\ub294 \uc5b4\ub5bb\uac8c \ud574\uc57c \ud560\uae4c?<\/p>\n<p>\uc544\ub798 \uc608\uc81c \ucf54\ub4dc\ucc98\ub7fc \uc791\uc131\ud558\uba74 \ub41c\ub2e4.<\/p>\n<p><code lang=\"c[lines-notools]\"><br \/>\n\/\/ Receive 0MQ string from socket and convert into C string<br \/>\n\/\/ Chops string at 255 chars, if it's longer<br \/>\nstatic char* s_recv(<br \/>\n    void* socket<br \/>\n    )<br \/>\n{<br \/>\n    char buffer[256];<br \/>\n    int size = zmq_recv(socket, buffer, 255, 0);<br \/>\n    if(size == &minus;1)<br \/>\n        return NULL;<br \/>\n    if(size > 255)<br \/>\n        size = 255;<br \/>\n    buffer[size] = 0;<br \/>\n    return strdup(buffer);<br \/>\n}<br \/>\n<\/code><\/p>\n<p>\uc55e\uc73c\ub85c \ub4f1\uc7a5\ud558\ub294 \uc608\uc81c\ub4e4\uc740 \ub300\ubd80\ubd84 \uc704\uc640 \uac19\uc740 \uac1c\ub7c9\ub41c(?) \ud568\uc218\ub97c \uc0ac\uc6a9\ud560 \uac83\uc774\ub2e4. \uc704\uc640 \uac19\uc740 \ud568\uc218\ub4e4\uc744 \ubaa8\uc544\uc11c \ubcc4\ub3c4\uc758 \ud30c\uc77c\ub85c \ub9cc\ub4e0\uac83\uc774 zhelpers.h \ud30c\uc77c\uc774\ub2e4. zhelpers.h \ud30c\uc77c\uc744 \ub2e4\uc6b4\ubc1b\uae30\ub97c \uc6d0\ud55c\ub2e4\uba74 http:\/\/zguide.zeromq.org\/ \ub97c \ubc29\ubb38\ud558\uba74 \ub41c\ub2e4.<\/p>\n<p><strong>Version Reporting<\/strong><\/p>\n<p>ZeroMQ\ub294 \ub9ce\uc740 \uc218\uc758 \ubc84\uc804\uc744 \uac00\uc9c0\uace0 \uc788\ub2e4. \ub9cc\uc57d, ZeroMQ\ub97c \uc0ac\uc6a9\ud558\ub358 \ub3c4\uc911 \ubb38\uc81c\uac00 \ubc1c\uc0dd\ud588\ub2e4\uba74, \ub300\ubd80\ubd84\uc740 \uc774\ud6c4\uc758 \ubc84\uc804\uc5d0\uc11c \uc218\uc815\ub418\uc5b4 \uc788\uc744 \uac83\uc774\ub2e4. \ud604\uc7ac \uc0ac\uc6a9\uc911\uc778(Link \ub418\uc5b4 \uc788\ub294) \uc815\ud655\ud55c ZeroMQ\uc758 \ubc84\uc804 \uc815\ubcf4\ub294 \ub2e4\uc74c\uc758 \ucf54\ub4dc\ub85c \ud655\uc778\uc774 \uac00\ub2a5\ud558\ub2e4.<\/p>\n<p><code lang=\"c[lines-notools]\"><br \/>\n\/\/ Report 0MQ version<\/p>\n<p>#include <zmq.h><\/p>\n<p>int main(void)<br \/>\n{<br \/>\n    int major, minor, patch;<br \/>\n    zmq_version(&major, &minor, &patch);<br \/>\n    printf(\"Current 0MQ version is %d.%d.%dn\", major, minor, patch);<br \/>\n    return 0;<br \/>\n}<br \/>\n<\/code><\/p>\n<p>\ud504\ub85c\uadf8\ub7a8\uc744 \uc2e4\ud589\ud574\ubcf4\uba74 \ub2e4\uc74c\uacfc \uac19\uc774 \ub098\uc628\ub2e4.<\/p>\n<blockquote><p>Current 0MQ version is 3.2.3<\/p><\/blockquote>\n<p><strong>Getting the Message Out<\/strong><\/p>\n<p>\ub450\ubc88\uc9f8\ub85c \ub2e4\ub8f0 \ud328\ud134\uc740 \ud558\ub098\uc758 Server\uc640 \ub2e4\uc218\uac1c\uc758 Client\ub85c \uc774\ub8e8\uc5b4\uc9c0\ub294 One-way(\uc77c\ubc29\ud5a5) \ub370\uc774\ud130 \ubc30\ud3ec \ud328\ud134\uc774\ub2e4. \uc608\ub97c \ub4e4\uc5b4 \uc6b0\ud3b8 \ubc88\ud638, \uc628\ub3c4, \uc2b5\ub3c4 \ub97c \ud3ec\ud568\ud558\ub294 \ub0a0\uc528 \uc815\ubcf4\ub97c \ubc30\ud3ec\ud558\ub294 \uc2dc\uc2a4\ud15c\uc744 \ub9cc\ub4e4\uc5b4\ubcf4\uc790. \uc9c4\uc9dc \uae30\uc0c1 \uc13c\ud130\uac00 \ud558\ub294 \uac83\ucc98\ub7fc \ub0a0\uc528 \uc815\ubcf4\ub3c4 \ub79c\ub364\ud558\uac8c \ub9cc\ub4e4\uc5b4 \ubcf4\uc790.<\/p>\n<p>Server\ucabd \ucf54\ub4dc\uc774\ub2e4. 5556 \ud3ec\ud2b8\ub97c \uc0ac\uc6a9\ud55c\ub2e4.<\/p>\n<p><code lang=\"c[lines-notools]\"><br \/>\n\/\/ Weather update server<br \/>\n\/\/ Bind PUB socket to tcp:\/\/*:5556<br \/>\n\/\/ Publishes random weather updates<\/p>\n<p>#include \"zhelpers.h\"<\/p>\n<p>int main(int argc, char **argv)<br \/>\n{<br \/>\n    \/\/ Prepare our context and publisher<br \/>\n    void* context = zmq_ctx_new();<br \/>\n    void* publisher = zmq_socket(context, ZMQ_PUB);<br \/>\n    int rc;<\/p>\n<p>    rc = zmq_bind(publisher, \"tcp:\/\/*:5556\");<br \/>\n    assert(rc == 0);<\/p>\n<p>    rc = zmq_bind(publisher, \"ipc:\/\/weather.ipc\");<br \/>\n    assert(rc == 0);<\/p>\n<p>    \/\/ Initialize random number generator<br \/>\n    srandom((unsigned)time(NULL));<br \/>\n    while(1)<br \/>\n    {<br \/>\n        \/\/ Get values that will fool the boss<br \/>\n        int zipcode, temperature, relhumidity;<br \/>\n        zipcode     = randof(100000);<br \/>\n        temperature = randof(215) &minus; 80;<br \/>\n        relhumidity = randof(50) + 10;<\/p>\n<p>        \/\/ Send message to all subscribers<br \/>\n        char update[20];<br \/>\n        sprintf(update, \"%05d %d %d\", zipcode, temperature, relhumidity);<br \/>\n        s_send(publisher, update);<br \/>\n    }<\/p>\n<p>    zmq_close(publisher);<br \/>\n    zmq_ctx_destroy(context);<\/p>\n<p>    return 0;<\/p>\n<p>}<br \/>\n<\/code><\/p>\n<p>\uc2dc\uc791\ub3c4 \ub05d\ub3c4 \uc5c6\ub294 Broadcasting \uc774\ub2e4. \uadf8\ub0e5 \ubb34\uc870\uac74 \ub370\uc774\ud130\ub97c \uc804\uc1a1\ud55c\ub2e4.<\/p>\n<p>\uc774\uc81c Client \ub97c \uc791\uc131\ud574\ubcf4\uc790. Client\uc758 \uc694\uc9c0\ub294 \ubaa8\ub4e0 \ub370\uc774\ud130\uc5d0 \uc8fc\uc758\ub97c \uae30\uc6b8\uc774\ub418, \ud2b9\uc815 zip code(\uc6b0\ud3b8\ubc88\ud638) \ub370\uc774\ud130\ub9cc \uc218\uc2e0\ud558\ub294 \uac83\uc774\ub2e4. \uae30\ubcf8\uc73c\ub85c \ub274\uc695\uc2dc\uc758 \uc6b0\ud3b8\ubc88\ud638\ub97c \uc0ac\uc6a9\ud558\ub3c4\ub85d \ud558\uaca0\ub2e4. \ub274\uc695\uc740 \ubb54\uac00 \ubaa8\ud5d8\uc744 \uc2dc\uc791\ud558\uae30\uc5d0 \uc88b\uc740 \uc7a5\uc18c\uc774\ubbc0\ub85c.. \u314e\u314e<\/p>\n<p><code lang=\"c[lines-notools]\"><br \/>\n\/\/ Weather update client<br \/>\n\/\/ Connects SUB socket to tcp:\/\/localhost:5556<br \/>\n\/\/ Collects weather updates and finds avg temp in zipcode<\/p>\n<p>#include \"zhelpers.h\"<\/p>\n<p>int main(int argc, char** argv)<br \/>\n{<br \/>\n    \/\/ Socket to talk to server<br \/>\n    printf(\"Collecting updates from weather server...n\");<br \/>\n    void* context = zmq_ctx_new();<br \/>\n    void* subscriber = zmq_socket(context, ZMQ_SUB);<br \/>\n    int rc;<\/p>\n<p>    rc = zmq_connect(subscriber, \"tcp:\/\/localhost:5556\");<br \/>\n    assert(rc == 0);<\/p>\n<p>    \/\/ Subscriber to zipcode, default is NYC, 10001<br \/>\n    char* filter = (argc > 1) ? argv[1]:\"10001\";<br \/>\n    rc = zmq_setsockopt(subscriber, ZMQ_SUBSCRIBE, filter, strlen(filter));<br \/>\n    assert(rc == 0);<\/p>\n<p>    \/\/ Process 100 updates<br \/>\n    int     update_nbr;<br \/>\n    long    total_temp = 0;<br \/>\n    for(update_nbr = 0; update_nbr < 100; update_nbr++)\n    {\n        char* string = s_recv(subscriber);\n        \n        int zipcode, temperature, relhumidity;\n        sscanf(string, \"%d %d %d\", &#038;zipcode, &#038;temperature, &#038;relhumidity);\n        printf(\"[%d]: %sn\", update_nbr, string);\n        total_temp += temperature;\n        free(string);\n    }\n    \n    printf(\"Average temperature for zipcode '%s' was %dFn\", filter, (int)(total_temp \/ update_nbr));\n    \n    zmq_close(subscriber);\n    zmq_ctx_destroy(context);\n    \n    return 0;\n}\n<\/code><\/p>\n<p>\uc2e4\ud589\ud558\uba74 \uc544\ub798\uc640 \uac19\uc774 \ub098\uc628\ub2e4.<\/p>\n<blockquote><p>Collecting updates from weather server...<\/p>\n<p>[0]: 10001 -20 32<\/p>\n<p>[1]: 10001 -51 11<\/p>\n<p>[2]: 10001 9 13<\/p>\n<p>...<\/p>\n<p>[96]: 10001 -35 21<\/p>\n<p>[97]: 10001 82 52<\/p>\n<p>[98]: 10001 43 53<\/p>\n<p>[99]: 10001 -39 56<\/p>\n<p>Average temperature for zipcode '10001' was 37F<\/p><\/blockquote>\n<p><a href=\"http:\/\/pchero21.com\/wp-content\/uploads\/2014\/01\/fig411.png\"><img loading=\"lazy\" class=\"aligncenter size-full wp-image-3017\" alt=\"fig4\" src=\"http:\/\/pchero21.com\/wp-content\/uploads\/2014\/01\/fig411.png\" width=\"414\" height=\"368\" \/><\/a>\ud55c\uac00\uc9c0 \uc5fc\ub450\ud574\ub450\uc5b4\uc57c \ud558\ub294 \uc810\uc740 SUB \uc18c\ucf13\uc744 \uc0ac\uc6a9\ud560 \ub54c\ub294, <strong>\ubc18\ub4dc\uc2dc <\/strong>zmq_setsockopt() \uc640 SUBSCRIBE \uc9c0\uc2dc\uc790\ub97c \ucf54\ub4dc\uc548\uc5d0 \uc785\ub825\ud558\uc5ec \uc774\uc6a9\ud558\uc5ec \uc218\uc2e0\ud560 \ub370\uc774\ud130\ub97c \uc124\uc815\ud574\uc57c \ud55c\ub2e4\ub294 \uac83\uc774\ub2e4. \ub9cc\uc57d \uc218\uc2e0\ud560 \ub370\uc774\ud130(subscription)\uc744 \uc9c0\uc815\ud558\uc9c0 \uc54a\ub294\ub2e4\uba74, \uadf8 \uc5b4\ub5a4 \uba54\uc2dc\uc9c0\ub3c4 \uc218\uc2e0\ud560 \uc218 \uc5c6\ub2e4. \uc774\ub294 \uc774\uc81c \ub9c9 ZeroMQ \ub97c \uc0ac\uc6a9\ud558\uae30 \uc2dc\uc791\ud558\ub294 \uc0ac\ub78c\ub4e4\uc774 \ud558\ub294 \ud754\ud55c \uc2e4\uc218\uc774\ub2e4. \ud558\ub098\uc758 \uad6c\ub3c5 \uc9c0\uc2dc\uc790(Subscriber)\ub294 \ud55c\ubc88\uc5d0 \uc5ec\ub7ec\uac1c\uc758 \uc218\uc2e0\ud560 \ub370\uc774\ud130(Subscription) \uc9c0\uc815\uc774 \uac00\ub2a5\ud558\ub2e4. \ubb3c\ub860, Subscription \uc9c0\uc815 \ucde8\uc18c\ub3c4 \uac00\ub2a5\ud558\ub2e4. \uadf8\ub9ac\uace0 Subscription \uc740 \ubc18\ub4dc\uc2dc String \uc774 \uc544\ub2c8\uc5b4\ub3c4 \uc0c1\uad00\uc5c6\ub2e4. \uc790\uc138\ud55c \uc124\uc815\uc740 zmq_setsockopt() \uc124\uba85\uc744 \ucc38\uace0 \ubc14\ub780\ub2e4.<\/p>\n<p>PUB-SUB \uc18c\ucf13\uc740 \ube44\ub3d9\uae30\ub85c \uc791\ub3d9\ud55c\ub2e4. Client \ub294 \uadf8\uc800 zmq_recv() \ub9cc\uc744 \uc218\ud589\ud560 \ubfd0\uc774\ub2e4. \ub9cc\uc57d SUB \uc18c\ucf13\uc744 \ud1b5\ud574 send \ub97c \ud558\uace0\uc790 \ud55c\ub2e4\uba74, \uc5d0\ub7ec\uac00 \ubc1c\uc0dd\ud55c\ub2e4. \uadf8\ub9ac\uace0 Server \uc758 \uacbd\uc6b0, zmq_send() \ub97c \ud1b5\ud574 \ub370\uc774\ud130 \uc804\uc1a1\ub9cc\uc744 \ud560 \ubfd0\uc774\ub2e4. \ub9c8\ucc2c\uac00\uc9c0\ub85c, PUB \uc18c\ucf13\uc73c\ub85c zmq_recv() \ub97c \ud55c\ub2e4\uba74 \uc5d0\ub7ec\uac00 \ubc1c\uc0dd\ud55c\ub2e4.<\/p>\n<p>ZeroMQ\uc5d0\uc11c\ub294 \ub204\uac00 connect \ub97c \uc218\ud589\ud558\uace0, \ub204\uac00 bind \ub97c \uc218\ud589\ud558\ub294\uc9c0\ub294 \uc911\uc694\ud558\uc9c0 \uc54a\ub2e4. \ud558\uc9c0\ub9cc \uc2e4\uc81c\uc801\uc73c\ub85c\ub294 \ub2e4\ub978\uc810\uc774 \uc788\ub2e4. \uadf8\uac74 \ub098\uc911\uc5d0 \ub2e4\ub8e8\uc5b4\ubcf4\ub3c4\ub85d \ud558\uace0... \uc9c0\uae08\uc740 bind \ub294 PUB \uac00 \uc218\ud589\ud558\uace0, connect \ub294 SUB\uac00 \uc218\ud589\ud55c\ub2e4\uace0\ub9cc \uc54c\uc544\ub450\uc790.<\/p>\n<p>PUB-SUB \uc18c\ucf13\uc5d0 \ub300\ud574\uc11c \ud55c\uac00\uc9c0 \ub354 \uc54c\uc544\uc57c \ud560 \uc911\uc694\ud55c \uc0ac\uc2e4\uc774 \uc788\ub2e4. Publisher \uc5d0\uc11c\ub294 \ub204\uac00 \uc5b8\uc81c\ubd80\ud130 \uad6c\ub3c5\uc744 \uc2dc\uc791\ud588\ub294\uc9c0 \ubaa8\ub978\ub2e4\ub294 \uc810\uc774\ub2e4. \uadf8\ub9ac\uace0 \ub9cc\uc57d&nbsp; Subscriber \ub97c \uba3c\uc800 \uc2dc\uc791\ud558\uace0, Publisher \ub97c \ub098\uc911\uc5d0 \uc2dc\uc791\ud588\ub2e4 \ud558\ub354\ub77c\ub3c4 Publisher \uac00 \uc804\uc1a1\ud558\ub294 \uccab\ubc88\uc9f8 \uba54\uc2dc\uc9c0\ub294 \ud56d\uc0c1 \uc218\uc2e0\ud558\uc9c0 \ubabb\ud560 \uac83\uc774\ub2e4. Subscriber \uac00 Publisher \uc5d0\uac8c \uc811\uc18d\uc744 \ud558\uace0 \uad6c\ub3c5\uc744 \uc2dc\uc791\ud558\ub294 \uc2dc\uac04\uc774 \ub9e4\uc6b0 \uc9e7\ub2e4\uace0\ub294 \ud558\ub098 0\ucd08\uac00 \uc544\ub2c8\uae30 \ub54c\ubb38\uc774\ub2e4. \uadf8\ub9ac\uace0, \uadf8 \uc9e7\uc740 \uc2dc\uac04\ub3d9\uc548 Publisher\ub294 \uc18c\ucf13\uc73c\ub85c \uc774\ubbf8 \ub370\uc774\ud130\ub97c \uc804\uc1a1\ud588\uae30 \ub54c\ubb38\uc774\ub2e4.<\/p>\n<p>\uc774\ub97c \"slow joiner\"\ub77c\uace0 \ud45c\ud55c\ub2e4. ZeroMQ \ub294 Background \uc5d0\uc11c \ub3d9\uc791\ud558\ub294 \ube44\ub3d9\uae30 I\/O\ub77c\ub294 \uc810\uc744 \uae30\uc5b5\ud558\ub77c.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>ZeroMQ \ub294 \ub124\ud2b8\uc6cc\ud06c \uc18c\ucf13 \uad00\ub9ac\ub97c \uc704\ud55c \ub77c\uc774\ube0c\ub7ec\ub9ac\uc774\ub2e4. \uc774\ubc88 \ud504\ub85c\uc81d\ud2b8\ub97c \uc9c4\ud589\ud558\uba74\uc11c Libevent + ZeroMQ \ub97c \uc0ac\uc6a9\ud558\uac8c \ub418\uc5c8\ub294\ub370 \ub108\ubb34 \ud6a8\uacfc\uac00 \uc88b\uc544\uc11c \uadf8 \ub0b4\uc6a9\uc744 \uc815\ub9ac\ud55c\ub2e4. \uc774\uacf3\uc5d0 \uc62c\ub824\uc9c4 \ubaa8\ub4e0 ZeroMQ \uad00\ub828 \ub0b4\uc6a9\uc740 \ubaa8\ub450 zguide.zeromq.org \uc5d0 \uc788\ub294 \ub0b4\uc6a9\uc744 \ubc14\ud0d5\uc73c\ub85c \uc815\ub9ac\ud574 \ub193\uc740 \uac83\uc774\uba70, \ubaa8\ub4e0 \uc6d0\ubb38 \ub0b4\uc6a9\uc740 &hellip; <a href=\"http:\/\/pchero21.com\/?p=3306\">Continue reading <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[43],"tags":[],"_links":{"self":[{"href":"http:\/\/pchero21.com\/index.php?rest_route=\/wp\/v2\/posts\/3306"}],"collection":[{"href":"http:\/\/pchero21.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/pchero21.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/pchero21.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/pchero21.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=3306"}],"version-history":[{"count":0,"href":"http:\/\/pchero21.com\/index.php?rest_route=\/wp\/v2\/posts\/3306\/revisions"}],"wp:attachment":[{"href":"http:\/\/pchero21.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=3306"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/pchero21.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=3306"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/pchero21.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=3306"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}