1. 程式人生 > >ZeroMQ介面函式之 :zmq_setsockopt –設定ZMQ socket的屬性

ZeroMQ介面函式之 :zmq_setsockopt –設定ZMQ socket的屬性

翻譯:郝峰波

zmq_setsockopt(3)         ØMQ Manual - ØMQ/4.1.0

Name

zmq_setsockopt –設定ZMQ socket的屬性

Synopsis

int zmq_setsockopt (void *socket, int option_name, const void *option_value, size_t option_len);
注意:除了以下屬性,所有的屬性均需要在對socket進行bind/connect操作之前設定:
ZMQ_SUBSCRIBE, ZMQ_UNSUBSCRIBE, ZMQ_LINGER, ZMQ_ROUTER_HANDOVER,
ZMQ_ROUTER_MANDATORY, ZMQ_PROBE_ROUTER, ZMQ_XPUB_VERBOSE, ZMQ_REQ_CORRELATE, and ZMQ_REQ_RELAXED

特別的,安全的屬性也可以在bind
/connect操作之後生效,並且可以隨時進行修改並影響之後的bind/connect操作。

Description

zmq_setsockopt()函式會對socket引數指定的socket進行設定,設定的屬性由option_name引數指定,屬性值由引數option_value指定。option_len引數指定屬性值的資料儲存空間的大小。

以下的socket屬性可以通過zmq_setsockopt()函式進行設定:

ZMQ_SNDHWM:對向外傳送的訊息設定高水位(最大快取量)

ZMQ_SNDHWM屬性將會設定socket引數指定的socket對外發送的訊息的高水位。高水位是一個硬限制,它會限制每一個與此socket相連的在記憶體中排隊的未處理的訊息數目的最大值。0值代表著沒有限制。

如果已經到達了規定的限制,socket就需要進入一種異常的狀態,表現形式因socket型別而異。socket會進行適當的調節,比如阻塞或者丟棄已傳送的訊息。請從zmq_socket(3)函式中檢視更多細節,獲取每種型別的socket的精確的行為。

ZMQ並不能保證可以接收像ZMQ_SNDHWM引數一樣多的訊息,而實際的限制可能在60~70%一下,這取決於這個socket上的訊息流。

屬性值的型別

int

屬性值的單位

訊息

預設值

1000

可以應用的socket型別

所有型別

ZMQ_RCVHWM:對進入socket的訊息設定高水位

ZMQ_RCVHWM屬性將會設定socket引數指定的socket進入的訊息的高水位。高水位是一個硬限制,它會限制每一個與此socket相連的在記憶體中排隊的未處理的訊息數目的最大值。0值代表著沒有限制。

如果已經到達了規定的限制,socket就需要進入一種異常的狀態,表現形式因socket型別而異。socket會進行適當的調節,比如阻塞或者丟棄被髮送的訊息。請從zmq_socket(3)函式中檢視更多細節,獲取每種型別的socket的精確的行為。

屬性值的型別

int

屬性值的單位

訊息

預設值

1000

可以應用的socket型別

所有型別

ZMQ_AFFINITY:設定I/O執行緒關聯

ZMQ_AFFINITY屬性會對socket引數指定的socket新建立的連結設定I/O執行緒關聯。

關聯指明瞭和scoket相關的context上的哪個執行緒池中的哪個執行緒來處理新建立的連結。0值表示沒有關聯,這意味著工作將線上程池中平等的向所有程序進行分發。對於非0值,最低位對應執行緒1,第二低位對應執行緒2,等等。比如,設定的值是3的話,說明socket上這之後的連結請求將被I/P執行緒1和2處理。

請參見zmq_init(3)函數了解更多關於對I/O執行緒分配的細節。

屬性值的型別

uint64_t

屬性值的單位

N/A (bitmap)

預設值

0

可以應用的socket型別

N/A

ZMQ_SUBSCRIBE:建立訊息過濾標誌

ZMQ_SUBSCRIBE屬性將會在ZMQ_SUB型別的socekt上建立一個新的訊息過濾標誌。新建立的ZMQ_SUB型別socket會對進入socket的所有訊息進行過濾,這樣你就可以使用這個屬性來建立最初的訊息過濾項。

一個option_value的長度是0的過濾屬性會訂閱所有的廣播訊息。一個非空的option_value值會只訂閱所有以option_value的值為字首的訊息。一個ZMQ_SUB型別的socket可以附加多個過濾條件,只要一個訊息符合過濾條件中的任何一個就會被接受。

屬性值的型別

二進位制資料

屬性值的單位

N/A

預設值

N/A

可以應用的socket型別

ZMQ_SUB

ZMQ_UNSUBSCRIBE:移除訊息過濾選項

ZMQ_UNSUBSCRIBE選項會移除一個ZMQ_SUB型別中已經存在的訊息過濾項。需要被移除的過濾選項必須是已經使用ZMQ_SUBSCRIBE選項建立了的。如果添加了幾個相同的過濾項,ZMQ_UNSUBSCRIBE選項只會移除其中的一個,其它的可以繼續使用。

屬性值的型別

二進位制資料

屬性值的單位

N/A

預設值

N/A

可以應用的socket型別

ZMQ_SUB

ZMQ_IDENTITY:設定socket 身份ID

ZMQ_IDENTITY選項會設定socket的身份ID。socket的身份ID只會能在請求/回覆模式中使用。也就是說,可以使用ROUTER型別的socket進行socket串聯,根據給定的身份ID可以對訊息進行路由。

身份ID至少有1 B的長度,最多有255 B的長度。以0位開始的身份ID由ZMQ保留使用。

如果兩個socket使用相同的身份ID向第三方進行連線,後果是不確定的。

屬性值的型別

二進位制資料

屬性值的單位

N/A

預設值

NULL

可以應用的socket型別

ZMQ_REQ, ZMQ_REP, ZMQ_ROUTER, ZMQ_DEALER

ZMQ_RATE:設定廣播資料的頻率

ZMQ_RATE屬性會對socket的接收和傳送廣播(比如zmq_pgm())的頻率最大值進行設定。

屬性值的型別

int

屬性值的單位

千位元/秒

預設值

100

可以應用的socket型別

使用多路廣播時,對所有socket型別都可用

ZMQ_RECOVERY_IVL:設定多路廣播恢復時間

ZMQ_RECOVERY_IVL屬性將會對socket引數指定的socket多路廣播恢復時間進行設定。恢復時間決定了,當一個接收端從一個廣播組退出後再連線上來之前,在資料丟失,導致資料不可恢復前的最大時間間隔,時間以毫秒為單位。

注意:當設定較大的恢復時間時,這回非常耗記憶體。比如,傳輸速率是1Gbps時,1分鐘長的回覆時間,會導致7GB的記憶體消耗。

屬性值的型別

int

屬性值的單位

毫秒

預設值

10000

可以應用的socket型別

使用多路廣播時,對所有socket型別都可用

ZMQ_SNDBUF:設定核心傳輸緩衝區大小

ZMQ_SNDBUF屬性會對socekt引數指定的socket設定底層核心的傳輸快取大小,以B為單位進行設定。設定的屬性值是0,則意味著使用OS的預設值。你可以檢視你的作業系統手冊來獲得SO_SNDBUF屬性更詳細的資訊。

屬性值的型別

int

屬性值的單位

B(位元組)

預設值

0

可以應用的socket型別

所有型別

ZMQ_RCVBUF:設定核心傳輸緩衝區大小

ZMQ_RCVBUF屬性會對socekt引數指定的socket設定底層核心的傳輸快取大小,以B為單位進行設定。設定的屬性值是0,則意味著使用OS的預設值。你可以檢視你的作業系統手冊來獲得SO_RCVBUF屬性更詳細的資訊。

屬性值的型別

int

屬性值的單位

B(位元組)

預設值

0

可以應用的socket型別

所有型別

ZMQ_LINGER:為socket關閉設定停留時間

ZMQ_LINGER屬性會給指定的socket設定關閉前的停留時間。停留時間指定了在對一個socket呼叫zmq_close(3)函式之後,這個socekt上即將被髮送但還沒有被髮送到對端的訊息在記憶體中繼續停留的時間。這個屬性進而還會影響到與這個scoket相關聯的context上zmq_term(3)操作的進行終結的結果。下面簡述了不同的行為:

屬性值 -1表示無限的停留時間。還沒被髮送的訊息在socket呼叫zmq_close()操作之後不會被丟棄;試圖使用zmq_term()操作對context進行終結的操作會被阻塞,直到所有沒有被髮送的訊息被髮往對端為止。

屬性值0 表示沒有停留時間。當使用zmq_close()函式將socket關閉的時候,所有沒有被髮送呃訊息都會被丟棄。

屬性是正數值表示設定一個毫秒為單位的停留時間。在第socket呼叫zmq_close()操作後,還沒有傳送的訊息不會被丟棄;試圖使用zmq_term()對於此scoket相關聯的context進行終結的時候會被阻塞,直到所有未被髮送的訊息都被髮往對端;或者停留時間已經到達,此時所有未傳送的訊息都會被丟棄。

屬性值的型別

int

屬性值的單位

毫秒

預設值

-1

可以應用的socket型別

所有型別

ZMQ_RECONNECT_IVL:設定重連間隔

ZMQ_RECONNECT_IVL屬性會設定指定的scoket的初始套接字重連間隔。重連間隔是使用面向連線的傳輸方式的時候,當與對端的連結斷開後,嘗試再次進行連線時的ZMQ週期。屬性值是 -1表示不進行重連。

ZMQ中的重連間隔可能是個隨機的較大數值,以防在拓撲結構中重連風暴的發生。

屬性值的型別

int

屬性值的單位

毫秒

預設值

100

可以應用的socket型別

當使用面向連線的傳輸方式時,所有型別

ZMQ_RECONNECT_IVL_MAX:設定重連間隔的最大值

ZMQ_RECONNECT_IVL_MAX屬性會設定指定的scoket的重連間隔最大值。這是在ZMQ重連週期之間的最大值。在每次的重連企圖中,重連間隔值都會是前一次的兩倍,知道達到ZMQ_RECONNECT_IVL_MAX值。這允許指數補償策略。預設值表示不執行指數補償策略,並且重連間隔時間只基於ZMQ_RECONNECT_IVL進行計算。

低於ZMQ_RECONNECT_IVL的值將被忽略。

屬性值的型別

int

屬性值的單位

毫秒

預設值

0(只使用ZMQ_RECONNECT_IVL)

可以應用的socket型別

當使用面向連線的傳輸方式時,所有型別

ZMQ_BACKLOG:設定向外發起的連線佇列的最大長度

ZMQ_BACKLOG屬性會設定指定的socket的每一個向外連線佇列的最大長度;這隻對面向連線的傳輸方式起作用。要檢視更多細節請檢視你的作業系統的文件中listen函式。

屬性值的型別

int

屬性值的單位

連線

預設值

1000

可以應用的socket型別

當使用面向連線的傳輸方式時,所有型別

ZMQ_MAXMSGSIZE:可接受的最大進入訊息的大小

限制進入的訊息的大小。如果一端傳送了一條訊息比ZMQ_MAXMSGSIZE大,就會斷開連線。屬性值是 -1表示沒有限制。

屬性值的型別

int64_t

屬性值的單位

B(位元組)

預設值

-1

可以應用的socket型別

所有型別

ZMQ_MULTICAST_HOPS:多播資料包時候的最大網路中繼

設定從這個socket傳送出去的多播資料包的存活時間預設值是1,表示這個多播包不能離開本地網路。

屬性值的型別

int

屬性值的單位

網路中繼數

預設值

1

可以應用的socket型別

當使用面向連線的傳輸方式時,所有型別

ZMQ_RCVTIMEO:在一個recv操作返回EAGAIN錯誤前的最大時間

設定socket的接收操作超時時間。如果屬性值是0,zmq_recv(3)函式將會立刻返回,如果沒有接收到任何訊息,將會返回EAGAIN錯誤。如果屬性值是 -1,將會阻塞,直到接收到訊息為止。對於任何其它值,都會進行等待這麼多時間,直到返回EAGAIN錯誤。

屬性值的型別

int

屬性值的單位

毫秒

預設值

-1(無限等待)

可以應用的socket型別

所有型別

ZMQ_SNDTIMEO:在一個傳送操作返回EAGAIN之前等待的最大時間

設定指定socket的傳送超時。如果屬性值是0,zmq_send(3)函式會立即返回,如果無法傳送此訊息,則返回EAGAIN錯誤值。如果屬性值是 -1,那麼在訊息傳送之前會進入阻塞模式。對於所有其它的值,將會在超時時間內進行嘗試傳送訊息,超時後返回EAGAIN錯誤。

屬性值的型別

int

屬性值的單位

毫秒

預設值

-1(無限等待)

可以應用的socket型別

所有型別

ZMQ_IPV6:在socket上允許使用IPv6

設定此socket的IPv6屬性。屬性值是1表示IPv6在此socket上可以使用,而屬性值是0表示此socket上只能使用IPv4。當socket上允許使用IPv6的時候,這個scoket可以IPv4或者IPv6進行連線或者接受連線。

屬性值的型別

int

屬性值的單位

布林

預設值

0(false)

可以應用的socket型別

當使用TCP連線的時候,所有型別可用

ZMQ_IPV4ONLY:在socket上只使用IPv4

設定只使用IPv4屬性。不贊成使用這個屬性。請使用ZMQ_IPV6屬性。

屬性值的型別

int

屬性值的單位

布林

預設值

1(true)

可以應用的socket型別

當使用TCP連線的時候,所有型別可用

ZMQ_IMMEDIATE:佇列訊息只作用於已完成的連結

預設情況下,訊息佇列在及時連線沒有完全建立的時候也會向外傳送訊息。這會導致使用迴圈路由的scoket(REQ,PUSH,DEALER)訊息“丟失”。如果屬性值設定為1,訊息只會在連線已經建立完成的時候才會進行傳送。這回導致當另一方沒有連線的時候出現阻塞的情況,但是可以防止訊息佇列在等待連線的時候填充管道。

屬性值的型別

int

屬性值的單位

布林

預設值

0(false)

可以應用的socket型別

當使用面向連線的時候,所有型別可用

ZMQ_ROUTER_HANDOVER:處理ROUTER socket上的每一個身份ID名衝突

設定當ROUTER socket遇到同名身份ID時的行為。預設情況下,當兩個對頓使用相同的身份ID連線到同一個ROUTER socket上的時候,結果是不確定的。屬性值是1表示會使ROUTER scoket遇到身份ID衝突的時候進行身份ID的重新分配。特別的,第一次連線上來的socket將會被中介,而第二次連線上來的socket將會接收接下來所有路由給這個身份ID名的訊息。

屬性值的型別

int

屬性值的單位

0,1

預設值

0

可以應用的socket型別

ZMQ_ROUTER

ZMQ_ROUTER_MANDATORY:在ROUTER socket上只接收可以進行路由的訊息

設定ROUTER socket收到無法路由的訊息時的行為。預設屬性值是0,表示會靜默的丟棄不能路由到的訊息。屬性值是1時,如果訊息不能路由,會返回一個EHOSTUNREACH錯誤程式碼。

屬性值的型別

int

屬性值的單位

0,1

預設值

0

可以應用的socket型別

ZMQ_ROUTER

ZMQ_ROUTER_RAW:轉換ROUTER socket到原始模式

當設定為1的時候,及把ROUTER 設定為原始模式。當ROUTER為原始模式並且在使用tcp://傳輸方式的時候,將不會以ZMQ格式讀取和寫入TCP資料。這就使ZMQ應用程式可以和非ZMQ程式進行交流。當使用原始模式的時候,你不能使用明確的身份ID,並且在傳送訊息的時候ZMQ_MSGMORE標誌也會被忽略。在原始模式下,你可以採用在傳送了一個明確的身份ID後,緊跟著傳送一個空訊息來關閉一個指定的連線。

不建議使用這個選項,請使用ZMQ_STREAM 型別的socket來代替。

屬性值的型別

int

屬性值的單位

0,1

預設值

0

可以應用的socket型別

ZMQ_ROUTER

ZMQ_PROBE_ROUTER:ROUTER socket 的引導連線

當次屬性設定為1的時候,如果有閒的連線建立了或者接受了新的連線,這個scoket就會自動傳送一個空的訊息。你可以在連線到ROUTER socket的REQ、DEALER或者ROUTER socket上設定這個屬性。這些應用程式必須能夠區分這個空訊息。ZMQ_PROBE_ROUTER屬性實際上給ROUTER應用程式提供了一個訊號訊號,說明一個新的對端活著。

不要在一個向任何socket型別進行會話的socket上設定此屬性:結果是未知的。

屬性值的型別

int

屬性值的單位

0,1

預設值

0

可以應用的socket型別

ZMQ_ROUTER,ZMQ_DEALER,ZMQ_REQ

ZMQ_XPUB_VERBOSE:提供XPUB socket上的所有訂閱訊息

設定XPUB socket在新的訂閱和取消訂閱時的行為。預設屬性值是0,並且只允許新的訂閱訊息通過傳輸到上游。屬性值是1表示允許所有的訂閱資訊通過傳輸到上游。

屬性值的型別

int

屬性值的單位

0,1

預設值

0

可以應用的socket型別

ZMQ_XPUB

ZMQ_REQ_CORRELATE:匹配請求回覆

REQ scoket的預設行為是依靠訊息的次序進行請求和回覆的匹配,並且這種方式一般情況下也是足夠用的。當這個屬性值設定成1的時候,REQ socket 會在向外傳送的訊息前面加上一個請求ID幀字首。這就意味著整個訊息的結構是(請求ID,0,使用者幀)。REQ socket會丟棄所有不是以這兩個幀作為開始的訊息。

屬性值的型別

int

屬性值的單位

0,1

預設值

0

可以應用的socket型別

ZMQ_REQ

ZMQ_REQ_RELAXED:放鬆請求和回覆之間嚴格的輪換

預設情況下,REQ socket 不允許在接收到上一個回覆之前使用zmq_send(3)開始一個新的請求。當這個屬性值設定為1的時候,會允許傳送另一個請求,並且結果是斷開與期望回覆訊息端的底層的連結,在支援重連的傳輸協議裡,會觸發一個重連的嘗試。請求-回覆狀態被重置,並且一個新的請求會發送到下一個可用的對端上。

如果設定此屬性值為1,應該同時設定ZMQ_REQ_CORRELATE可用,以確保對請求和回覆的正確匹配。否則,如果一個已經被斷開的連結發來一個遲來的回覆,可能會被認作後來的請求的回覆。

屬性值的型別

int

屬性值的單位

0,1

預設值

0

可以應用的socket型別

ZMQ_REQ

ZMQ_TCP_KEEPALIVE:代替SO_KEEPALIVE屬性

代替了SO_KEEPALIVE屬性。預設值是 -1,表示跳過所有的重寫操作,並且把這些屬性值交給作業系統。

屬性值的型別

int

屬性值的單位

-1, 0,1

預設值

-1(使用作業系統的值)

可以應用的socket型別

當使用TCP連線的時候,所有型別可用

ZMQ_TCP_KEEPALIVE_IDLE:代替TCP_KEEPCNT(有些作業系統上是TCP_KEEPALIVE)屬性

代替TCP_KEEPCNT(有些作業系統上是TCP_KEEPALIVE)屬性(當作業系統支援的時候)。預設值是 -1,表示跳過所有的重寫操作,並且把這些屬性值交給作業系統。

屬性值的型別

int

屬性值的單位

-1,  > 0

預設值

-1(使用作業系統的值)

可以應用的socket型別

當使用TCP連線的時候,所有型別可用

ZMQ_TCP_KEEPALIVE_CNT:代替TCP_KEEPCNT socket屬性

代替TCP_KEEPCNT socket屬性(當作業系統支援的時候)。預設值是 -1,表示跳過所有的重寫操作,並且把這些屬性值交給作業系統。

屬性值的型別

int

屬性值的單位

-1,  > 0

預設值

-1(使用作業系統的值)

可以應用的socket型別

當使用TCP連線的時候,所有型別可用

ZMQ_TCP_KEEPALIVE_INTVL:代替TCP_KEEPINTVL socket 屬性

代替TCP_KEEPINTVL socket 屬性(當作業系統支援的時候)。預設值是 -1,表示跳過所有的重寫操作,並且把這些屬性值交給作業系統。

屬性值的型別

int

屬性值的單位

-1,  > 0

預設值

-1(使用作業系統的值)

可以應用的socket型別

當使用TCP連線的時候,所有型別可用

ZMQ_TCP_ACCEPT_FILTER:為新連上來的TCP連線分配過濾器

在一個監聽socket上分配一個任意的過濾器會作用於每一個新連線上來的TCP連結。如果沒有使用任何過濾器,TCP傳輸會允許任意的IP地址連線上來。如果設定了至少一個過濾器,那麼新連線上來的源ip就需要能夠匹配。向情況所有的過濾器,請呼叫zmq_setsockopt(socket, ZMQ_TCP_ACCEPT_FILTER, NULL, 0)。過濾器是一個以空位元組結尾的IPv6或IPv4 CIDR(無類域間路由)。

屬性值的型別

二進位制資料

屬性值的單位

N/A

預設值

無過濾(允許任何地方來的)

可以應用的socket型別

當使用TCP連線的時候,所有監聽socket

ZMQ_PLAIN_SERVER:設定PLAIN 服務的角色

定義一個socket是否作為PLAIN 安全方式的服務端,參見zmq_plain(7)。設定屬性值為1表示這個scoket將會作為PLAIN的服務端。屬性值設定為0表示這個socket不作為PLAIN服務端,並且它的安全方式依賴於其它的屬性設定。設定此屬性為0會重置這個scoket的安全方式為NULL。

屬性值的型別

int

屬性值的單位

0,1

預設值

0

可以應用的socket型別

當使用TCP連線的時候,所有型別可用

ZMQ_PLAIN_USERNAME:設定PLAIN安全方式的使用者名稱

設定TCP或者IPC對外連線的使用者名稱。如果你設定這個屬性為非空值,用於連線的安全機制會是PLAIN,參見zmq_plain(7)。如果你設定此屬性值為空值,用於連線的安全機制會是NULL,參見zmq_null(3)

屬性值的型別

特徵字串

屬性值的單位

N/A

預設值

不設定

可以應用的socket型別

當使用TCP連線的時候,所有型別可用

ZMQ_PLAIN_PASSWORD:設定PLAIN安全方式的密碼

設定TCP或者IPC對外連線的密碼。如果你設定這個屬性為非空值,用於連線的安全機制會是PLAIN,參見zmq_plain(7)。如果你設定此屬性值為空值,用於連線的安全機制會是NULL,參見zmq_null(3)

屬性值的型別

特徵字串

屬性值的單位

N/A

預設值

不設定

可以應用的socket型別

當使用TCP連線的時候,所有型別可用

ZMQ_CURVE_SERVER:設定CURVE服務端角色

定義一個socket是否為CURVE 安全方式的服務端,參見zmq_curve(7)。屬性值是1表示這個 socket將會作為一個CURVE服務端。屬性值是0表示這個socket將不會作為CURVE客戶端,並且其安全方式的角色將會依賴於其它屬性設定。設定此屬性值為0將會重置此socket的安全方式為NULL。如果你設定這個屬性,你必須使用ZMQ_CURVE_SECRETKEY屬性設定這個服務端的祕鑰。一個服務端socket不需要知道它自己的公鑰。

屬性值的型別

int

屬性值的單位

0, 1

預設值

0

可以應用的socket型別

當使用TCP連線的時候,所有型別可用

ZMQ_CURVE_PUBLICKEY:設定CURVE公鑰

設定socket的長期公鑰。你必須設定CURVE客戶端的這個屬性,參見zmq_curve(7)。你可以用32位二進位制位元組或者經過Z85格式加密後的40字串。這個公鑰必須和祕鑰匹配使用。可以使用zmq_curve_keypair(3)函式生成一個公鑰/金鑰對。

屬性值的型別

二進位制資料或者Z85格式的文字字串

屬性值的單位

32或者40

預設值

NULL

可以應用的socket型別

當使用TCP連線的時候,所有型別可用

ZMQ_CURVE_SECRETKEY:設定CURVE金鑰

這是此socket的長期金鑰。你必須在CURVE客戶端和服務端上都設定此屬性,參見zmq_curve(7)。你可以用32位二進位制位元組或者經過Z85格式加密後的40字串。這個公鑰必