ZeroMQ API 目錄 :http://www.cnblogs.com/fengbohello/p/4230135.html
ZeroMQ 官方地址:http://api.zeromq.org/4-0:zmq-socket
翻譯:風波
mail : fengbohello@qq.com
—————————————————————————————————————
zmq_socket(3) ØMQ Manual - ØMQ/4.0
Name
zmq_socket – 創建ZMQ套接字
Synopsis
void *zmq_socket (void *context, int type);
Description
函數zmq_socket()根據context參數創建一個ZMQ套接字(socket),並且以一個不透明指針的形式返回這新創建的socket。type參數指明了要創建的socket的類型,這個類型決定了在進行傳輸時在此socket上執行的語義。
新創建的socket初始值是未綁定的,並且未和任何終結點相聯系。為了能夠在一個socket上建立消息,必須先要使用zmq_connect(3)連接上一個終結點,或者至少有使用zmq_bind(3)函數綁定一個終結點來接收傳入的消息。
與傳統套接字不同的關鍵
一般說來,傳統的套接字提出了一種同步接口,無論是面向連接的可靠字節流(SOCK_STREAM),還是無連接的不可靠數據報(SOCK_DGRAM)。比較而言,ZMQ套接字提出了一種異步消息隊列的抽象機制,基於socket類型的精確的隊列語義。傳統的套接字傳輸字節流或者離散的數據報,ZMQ套接字傳輸離散的消息。
ZMWQ套接字使用了異步機制,意思是說按照時間對實體的連接和斷開、重連和有效的傳輸對用戶來說是透明的,是由ZMQ自己進行控制的。進一步,消息可能被添加到無法到達的目的端上。
傳統的套接字值允許嚴格的一對一(兩個對端)、多對一(多個客戶端,一個服務端),或者有些時候的一對多(多播)。在ZMQ中,出了ZMQ_PAIR類型的套接字,ZMQ允許使用zmq_connect()函數鏈接到多個終結點,而同時還可以在使用zmq_bind()函數綁定的終結點上接收多個終結點發來的消息,這就允許多對多的傳輸關系。
線程安全
ZMQ不是線程安全的。應用進程不能在多個線程間使用同一個套接字,除非已經將一個套接字的內存空間從一個線程完全的遷移到另一個線程中。
套接字類型
接下來的章節討論ZMQ定義的套接字類型,以普通的消息模式進行分組,消息模式和套接字類型是相聯系的。
請求-回復模式
請求-恢復模式用來從ZMQ_REQ客戶端向一個或多個ZMQ_REP服務端發送請求,並且接收隨后到來的對每一個發送端的恢復。
ZMQ_REQ
ZMQ_REQ類型的套接字用來從一個客戶端向一個服務端發送請求,並從這個服務端獲取回復。這類套接字值允許一種交替的執行順序:zmq_send(請求)和隨后到來的zmq_recv(回復)調用。每一個發送出去的請求都會在所有的服務端循環,並且每一個收到的消息都會與自后發出的相匹配。
當一個ZMQ_REQ套接字由於對所有的服務端都達到高水位而進入靜默狀態,或者如果沒有可用的服務端,之后在設個套接字上的所有的zmq_send(3)操作都會進入阻塞狀態,直到靜默狀態結束或者至少有一個可以的服務端變得可用;消息在此期間不會丟失。
| ZMQ_REQ特征摘要 |
|
| 兼容的對端套接字 |
ZMQ_REP, ZMQ_ROUTER |
| 消息方向 |
雙向 |
| 發送/接收模式 |
發送,接收,發送,接收…… |
| 流出路由策略 |
循環 |
| 流入路由策略 |
最后一次的對端 |
| 靜默狀態時的動作 |
阻塞 |
ZMQ_REP
ZMQ_REP類型的套接字被服務端用來接收戶端的請求並進行回復。這個套接字類型只允許按順序交替進行zmq_recv(請求)和隨后的zmq_send(回復)調用。每次的請求都會在所有的客戶端中間進行公平的派對,並且每次的回復都會被路由給最后一次對應的客戶端。如果原客戶端不存在可,這個回復事件會被靜默的丟棄。
當一個ZMQ_REP套接字由於接受了太多而到達高水位並進入了靜默狀態,所有被發送的回復,如果對端的客戶端出現了問題,將會被釋放掉,直到靜默狀態結束。
| ZMQ_REP特征摘要 |
|
| 兼容的對端套接字 |
ZMQ_REQ, ZMQ_DEALER |
| 消息方向 |
雙向 |
| 發送/接收模式 |
接收,發送,接收,發送…… |
| 流出路由策略 |
最后一次的對端 |
| 流入路由策略 |
公平排隊 |
| 靜默狀態時的動作 |
釋放 |
ZMQ_DEALER
ZMQ_DEALER套接字是請求/回復模式的升級。所有被發送的消息都會在所有被連接的對端進行循環,並且從所連接的對端中接收到的每一個消息都會進行平等的排隊。
當一個ZMQ_DEALER套接字由於對所有對端都到達高水位而進入了靜默模式,或者沒有可用的對端,此時在這個套接字上的所有zmq_send(3)操作都會進入阻塞,直到靜默模式終止或者至少有一個對端變得可用;此期間不會有消息丟失。
當一個ZMQ_DEALER套接字連通到一個ZMQ_REP套接字上的時候,每一個發出的消息必須包含一個空消息,作為一個界定符,后面跟着一個或多個消息體。
棄用的別名:ZMQ_XREQ。
| ZMQ_DEALER特征摘要 |
|
| 兼容的對端套接字 |
ZMQ_ROUTER, ZMQ_REP, ZMQ_DEALER |
| 消息方向 |
雙向 |
| 發送/接收模式 |
無限制 |
| 流出路由策略 |
循環 |
| 流入路由策略 |
平等排隊 |
| 靜默狀態時的動作 |
阻塞 |
ZMQ_ROUTER
ZMQ_ROUTER類型的套接字是請求/回復模式的一種升級。當ZMQ_ROUTER收到一個消息的時候,在向應用進程轉發之前,會拿掉消息中的第一幀,這個幀中包含着這個消息來源端的唯一身份地址。從所有的鏈接上來的對端中接收的消息都是平等排隊的。當發送一個消息的時候,ZMQ_ROUTER會移除消息中的第一幀,並且把這個幀作為接下來要路由到的目的地址的唯一標識符。如果消息的目的地址指向的對端不再存在了,這個消息就會被丟棄,除非消息屬性ZMQ_ROUTER_BEHAVIOR(新版本的ZMQ源代碼ChangeLog文件中注明,Renamed ZMQ_ROUTER_BEHAVIOR to ZMQ_ROUTER_MANDATORY)被設置為1。
當ZMQ_ROUTER套接字由於所有的對端到達高水位而進入靜默模式的時候,所有發送到這個套接字的消息都會被丟棄,直到靜默模式結束。同樣的,路由向任何對端的消息,如果此時這個對端已經到達高水位,這些消息也會被丟棄。
當一個ZMQ_ROUTER套接字連接到另一個ZMQ_ROUTER套接字的時候,在每一個接收到的消息中,除了消息源端的身份ID(及上文的唯一身份地址),還需要包含一個空的消息幀作為界定符。因此,應用進程看到的整個的消息結構就是:一個或多個身份ID幀,空白幀,一個或多個消息實體幀。當向一個ZMQ_REQ套接字發送回復的時候,應用程序必須包含這個空白幀。
棄用的別名:ZMQ_XREP
| ZMQ_ROUTER特征摘要 |
|
| 兼容的對端套接字 |
ZMQ_DEALER, ZMQ_REQ, ZMQ_ROUTER |
| 消息方向 |
雙向 |
| 發送/接收模式 |
無限制 |
| 流出路由策略 |
視文本而定 |
| 流入路由策略 |
公平排隊 |
| 靜默狀態時的動作 |
丟棄 |
發布-訂閱模式
發布-訂閱模式用於一對多模式中從一個發布者發出的消息以扇出的方式向多個訂閱者分發。
ZMQ_PUB
ZMQ_PUB套接字用來使發布者分發數據。消息會以扇出的方式被發送到所有連接上來的對端上。zmq_recv(3)函數不能在這個類型的套接字上使用。
由於一個訂閱者到達了高水位而使ZMQ_PUB套接字進入靜默模式的時候,所有發送到這個有問題的訂閱者的消息都會被丟棄,直到靜默模式終止。對於這個類型的套接字,zmq_send()函數永遠不會阻塞。
| ZMQ_PUB特征摘要 |
|
| 兼容的對端套接字 |
ZMQ_SUB, ZMQ_XSUB |
| 消息方向 |
單向的 |
| 發送/接收模式 |
只發送 |
| 流出路由策略 |
扇出(成扇形發出) |
| 流入路由策略 |
N/A(不適用) |
| 靜默狀態時的動作 |
丟棄 |
ZMQ_SUB
ZMQ_SUB類型的套接字用來訂閱發布者分發下來的數據。剛初始化的ZMQ_SUB套接字是無法訂閱任何消息的,適用zmq_setsockopt(3)函數的ZMQ_SUBSCRIBE屬性來指定要訂閱哪種消息。zmq_send()函數無法在這個類型的套接字上使用。
| ZMQ_SUB特征摘要 |
|
| 兼容的對端套接字 |
ZMQ_PUB,,ZMQ_XPUB |
| 消息方向 |
單向的 |
| 發送/接收模式 |
只接收 |
| 流出路由策略 |
平等排隊 |
| 流入路由策略 |
N/A(不適用) |
| 靜默狀態時的動作 |
丟棄 |
ZMQ_XPUB
和ZMQ_PUB類型一樣,但是可以接收對端發來的訂閱消息。訂閱消息是一個值為1的字節(表示訂閱)或者值為0的字節(表示不訂閱),后面跟着消息體。
| ZMQ_XPUB特征摘要 |
|
| 兼容的對端套接字 |
ZMQ_SUB, ZMQ_XSUB |
| 消息方向 |
單向的 |
| 發送/接收模式 |
發送消息,接收訂閱 |
| 流出路由策略 |
扇出 |
| 流入路由策略 |
N/A(不適用) |
| 靜默狀態時的動作 |
丟棄 |
ZMQ_XSUB
和ZMQ_SUB類型的套接字一樣,但是可以向套接字發送訂閱消息。訂閱消息是一個值為1的字節(表示訂閱)或者值為0的字節(表示不訂閱),后面跟着消息體。
| ZMQ_XSUB特征摘要 |
|
| 兼容的對端套接字 |
ZMQ_PUB,,ZMQ_XPUB |
| 消息方向 |
單向的 |
| 發送/接收模式 |
接收消息,發送訂閱 |
| 流出路由策略 |
N/A |
| 流入路由策略 |
平等排隊 |
| 靜默狀態時的動作 |
丟棄 |
管道模式
管道模式用來向排列在一個管道上的節點分發數據。數據總是順着管道的走向,而且管道的每一階段都至少要連接在一個節點上。當一個管道階段連接在多個節點上時,數據會在所有相連的節點上循環。
ZMQ_PUSH
ZMQ_PUSH類型的套接字被一個管道節點用來向管道的下游發送消息。消息向下游所有連接的節點循環。zmq_recv()函數在這個類型的套接字上不能使用。
當一個ZMQ_PUSH套接字在所有的管道下游節點上都到達高水位的時候,或者沒有下游節點的時候,會進入靜默模式,此時在這個套接字上的所有zmq_send(3)操作都會進入阻塞,直到靜默模式結束或者在下游出現至少一個可用的節點;消息不會被丟棄。
| ZMQ_PUSH特征摘要 |
|
| 兼容的對端套接字 |
ZMQ_PULL |
| 消息方向 |
單向的 |
| 發送/接收模式 |
只發送 |
| 流出路由策略 |
循環 |
| 流入路由策略 |
N/A |
| 靜默狀態時的動作 |
阻塞 |
ZMQ_PULL
ZMQ_PULL類型的套接字用來從管道的上游節點中接收消息。在所有連接的上游節點中,消息是平等排隊的。zmq_send()函數在這類套接字上無法使用。
| ZMQ_PULL特征摘要 |
|
| 兼容的對端套接字 |
ZMQ_PUSH |
| 消息方向 |
單向的 |
| 發送/接收模式 |
只接收 |
| 流出路由策略 |
N/A |
| 流入路由策略 |
平等排隊 |
| 靜默狀態時的動作 |
阻塞 |
獨立對模式
獨立對模式用來精確的連接另一個對端。這種模式通過inproc方式用來進程內部通信。
ZMQ_PAIR
ZMQ_PAIR類型的套接字在每一時刻只能鏈接到一個對端上。不會有消息被路由或者過濾的操發生在發送給ZMQ_PAIR套接字的的消息上。
當ZMQ_PAIR類型的套接字由於連接的對端到達高水位而進入靜默狀態,或者沒有可用的對端可以連接,在這個套戒指上的所有zmq_send(3)操作都會進入阻塞,直到本套接字可以發送消息為止;消息不會被丟棄。
ZMQ_PAIR類型的套接字被設計用來在線程間進行傳輸,采用zmq_inproc(7)方式;並且不支持諸如自動重連的功能。ZMQ_PAIR套接字是經過深思熟慮和實驗的,但可能會有遺漏或者破碎的方面。
| ZMQ_PAIR特征摘要 |
|
| 兼容的對端套接字 |
ZMQ_PAIR |
| 消息方向 |
雙向的 |
| 發送/接收模式 |
無限制 |
| 流出路由策略 |
N/A |
| 流入路由策略 |
N/A |
| 靜默狀態時的動作 |
阻塞 |
Return value
當zmq_socket()函數運行成功的時候會返回新創建的套接字句柄。否則,函數返回NULL並且設置errno的值為下面定義的值。
Errors
EINVAL
請求的套接字類型不可用。
EFAULT
參數提供的context不可用。
EMFILE
已經到達ZMQ context允許打開的套接字數量的上限。
ETERM
參數指定的context已經被終結了。
Example
使用zmq_stream創建一個簡單的http服務器
void *ctx = zmq_ctx_new (); assert (ctx); /* Create ZMQ_STREAM socket */
void *socket = zmq_socket (ctx, ZMQ_STREAM); assert (socket); int rc = zmq_bind (socket, "tcp://*:8080"); assert (rc == 0); /* Data structure to hold the ZMQ_STREAM ID */ uint8_t id [256]; size_t id_size = 256; while (1) { /* Get HTTP request; ID frame and then request */ id_size = zmq_recv (socket, id, 256, 0); assert (id_size > 0); /* Prepares the response */
char http_response [] =
"HTTP/1.0 200 OK\r\n"
"Content-Type: text/plain\r\n"
"\r\n"
"Hello, World!"; /* Sends the ID frame followed by the response */ zmq_send (socket, id, id_size, ZMQ_SNDMORE); zmq_send (socket, http_response, strlen (http_response), ZMQ_SNDMORE); /* Closes the connection by sending the ID frame followed by a zero response */ zmq_send (socket, id, id_size, ZMQ_SNDMORE); zmq_send (socket, 0, 0, ZMQ_SNDMORE); /* NOTE: If we don't use ZMQ_SNDMORE, then we won't be able to send more */
/* message to any client */ } zmq_close (socket); zmq_ctx_destroy (ctx);
See also
zmq_init(3) zmq_setsockopt(3) zmq_bind(3) zmq_connect(3) zmq_send(3) zmq_recv(3) zmq_inproc(7) zmq(7)
Authors
This ØMQ manual page was written by Martin Sustrik <sustrik@250bpm.com>, Martin Lucina <mato@kotelna.sk>, and Pieter Hintjens <ph@imatix.com>.
Web site design and content is copyright (c) 2007-2012 iMatix Corporation. Contact us for professional support. Site content licensed under the Creative Commons Attribution-Share Alike 3.0 License. ØMQ is copyright (c) Copyright (c) 2007-2012 iMatix Corporation and Contributors. ØMQ is free software licensed under the LGPL. ØMQ, ZeroMQ, and 0MQ are trademarks of iMatix Corporation. Terms of Use — Privacy
Policy
