ZeroMQ接口函数之 :zmq_setsockopt –设置ZMQ socket的属性
Name
zmq_setsockopt –設(shè)置ZMQ socket的屬性
Synopsis
int zmq_setsockopt (void *socket, int option_name, const void *option_value, size_t option_len);
注意:除了以下屬性,所有的屬性均需要在對socket進(jìn)行bind/connect操作之前設(shè)置:
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操作之后生效,并且可以隨時進(jìn)行修改并影響之后的bind/connect操作。
Description
zmq_setsockopt()函數(shù)會對socket參數(shù)指定的socket進(jìn)行設(shè)置,設(shè)置的屬性由option_name參數(shù)指定,屬性值由參數(shù)option_value指定。option_len參數(shù)指定屬性值的數(shù)據(jù)存儲空間的大小。
以下的socket屬性可以通過zmq_setsockopt()函數(shù)進(jìn)行設(shè)置:
ZMQ_SNDHWM:對向外發(fā)送的消息設(shè)置高水位(最大緩存量)
ZMQ_SNDHWM屬性將會設(shè)置socket參數(shù)指定的socket對外發(fā)送的消息的高水位。高水位是一個硬限制,它會限制每一個與此socket相連的在內(nèi)存中排隊的未處理的消息數(shù)目的最大值。0值代表著沒有限制。
如果已經(jīng)到達(dá)了規(guī)定的限制,socket就需要進(jìn)入一種異常的狀態(tài),表現(xiàn)形式因socket類型而異。socket會進(jìn)行適當(dāng)?shù)恼{(diào)節(jié),比如阻塞或者丟棄已發(fā)送的消息。請從zmq_socket(3)函數(shù)中查看更多細(xì)節(jié),獲取每種類型的socket的精確的行為。
ZMQ并不能保證可以接收像ZMQ_SNDHWM參數(shù)一樣多的消息,而實際的限制可能在60~70%一下,這取決于這個socket上的消息流。| 屬性值的類型 | int |
| 屬性值的單位 | 消息 |
| 默認(rèn)值 | 1000 |
| 可以應(yīng)用的socket類型 | 所有類型 |
ZMQ_RCVHWM:對進(jìn)入socket的消息設(shè)置高水位
ZMQ_RCVHWM屬性將會設(shè)置socket參數(shù)指定的socket進(jìn)入的消息的高水位。高水位是一個硬限制,它會限制每一個與此socket相連的在內(nèi)存中排隊的未處理的消息數(shù)目的最大值。0值代表著沒有限制。
如果已經(jīng)到達(dá)了規(guī)定的限制,socket就需要進(jìn)入一種異常的狀態(tài),表現(xiàn)形式因socket類型而異。socket會進(jìn)行適當(dāng)?shù)恼{(diào)節(jié),比如阻塞或者丟棄被發(fā)送的消息。請從zmq_socket(3)函數(shù)中查看更多細(xì)節(jié),獲取每種類型的socket的精確的行為。
| 屬性值的類型 | int |
| 屬性值的單位 | 消息 |
| 默認(rèn)值 | 1000 |
| 可以應(yīng)用的socket類型 | 所有類型 |
ZMQ_AFFINITY:設(shè)置I/O線程關(guān)聯(lián)
ZMQ_AFFINITY屬性會對socket參數(shù)指定的socket新創(chuàng)建的鏈接設(shè)置I/O線程關(guān)聯(lián)。
關(guān)聯(lián)指明了和scoket相關(guān)的context上的哪個線程池中的哪個線程來處理新創(chuàng)建的鏈接。0值表示沒有關(guān)聯(lián),這意味著工作將在線程池中平等的向所有進(jìn)程進(jìn)行分發(fā)。對于非0值,最低位對應(yīng)線程1,第二低位對應(yīng)線程2,等等。比如,設(shè)置的值是3的話,說明socket上這之后的鏈接請求將被I/P線程1和2處理。
請參見zmq_init(3)函數(shù)了解更多關(guān)于對I/O線程分配的細(xì)節(jié)。
| 屬性值的類型 | uint64_t |
| 屬性值的單位 | N/A (bitmap) |
| 默認(rèn)值 | 0 |
| 可以應(yīng)用的socket類型 | N/A |
ZMQ_SUBSCRIBE:創(chuàng)建消息過濾標(biāo)志
ZMQ_SUBSCRIBE屬性將會在ZMQ_SUB類型的socekt上創(chuàng)建一個新的消息過濾標(biāo)志。新建立的ZMQ_SUB類型socket會對進(jìn)入socket的所有消息進(jìn)行過濾,這樣你就可以使用這個屬性來建立最初的消息過濾項。
一個option_value的長度是0的過濾屬性會訂閱所有的廣播消息。一個非空的option_value值會只訂閱所有以option_value的值為前綴的消息。一個ZMQ_SUB類型的socket可以附加多個過濾條件,只要一個消息符合過濾條件中的任何一個就會被接受。
| 屬性值的類型 | 二進(jìn)制數(shù)據(jù) |
| 屬性值的單位 | N/A |
| 默認(rèn)值 | N/A |
| 可以應(yīng)用的socket類型 | ZMQ_SUB |
ZMQ_UNSUBSCRIBE:移除消息過濾選項
ZMQ_UNSUBSCRIBE選項會移除一個ZMQ_SUB類型中已經(jīng)存在的消息過濾項。需要被移除的過濾選項必須是已經(jīng)使用ZMQ_SUBSCRIBE選項建立了的。如果添加了幾個相同的過濾項,ZMQ_UNSUBSCRIBE選項只會移除其中的一個,其它的可以繼續(xù)使用。
| 屬性值的類型 | 二進(jìn)制數(shù)據(jù) |
| 屬性值的單位 | N/A |
| 默認(rèn)值 | N/A |
| 可以應(yīng)用的socket類型 | ZMQ_SUB |
ZMQ_IDENTITY:設(shè)置socket 身份ID
ZMQ_IDENTITY選項會設(shè)置socket的身份ID。socket的身份ID只會能在請求/回復(fù)模式中使用。也就是說,可以使用ROUTER類型的socket進(jìn)行socket串聯(lián),根據(jù)給定的身份ID可以對消息進(jìn)行路由。
身份ID至少有1 B的長度,最多有255 B的長度。以0位開始的身份ID由ZMQ保留使用。
如果兩個socket使用相同的身份ID向第三方進(jìn)行連接,后果是不確定的。
| 屬性值的類型 | 二進(jìn)制數(shù)據(jù) |
| 屬性值的單位 | N/A |
| 默認(rèn)值 | NULL |
| 可以應(yīng)用的socket類型 | ZMQ_REQ, ZMQ_REP, ZMQ_ROUTER, ZMQ_DEALER |
ZMQ_RATE:設(shè)置廣播數(shù)據(jù)的頻率
ZMQ_RATE屬性會對socket的接收和發(fā)送廣播(比如zmq_pgm())的頻率最大值進(jìn)行設(shè)置。
| 屬性值的類型 | int |
| 屬性值的單位 | 千比特/秒 |
| 默認(rèn)值 | 100 |
| 可以應(yīng)用的socket類型 | 使用多路廣播時,對所有socket類型都可用 |
ZMQ_RECOVERY_IVL:設(shè)置多路廣播恢復(fù)時間
ZMQ_RECOVERY_IVL屬性將會對socket參數(shù)指定的socket多路廣播恢復(fù)時間進(jìn)行設(shè)置。恢復(fù)時間決定了,當(dāng)一個接收端從一個廣播組退出后再連接上來之前,在數(shù)據(jù)丟失,導(dǎo)致數(shù)據(jù)不可恢復(fù)前的最大時間間隔,時間以毫秒為單位。
注意:當(dāng)設(shè)置較大的恢復(fù)時間時,這回非常耗內(nèi)存。比如,傳輸速率是1Gbps時,1分鐘長的回復(fù)時間,會導(dǎo)致7GB的內(nèi)存消耗。
| 屬性值的類型 | int |
| 屬性值的單位 | 毫秒 |
| 默認(rèn)值 | 10000 |
| 可以應(yīng)用的socket類型 | 使用多路廣播時,對所有socket類型都可用 |
ZMQ_SNDBUF:設(shè)置內(nèi)核傳輸緩沖區(qū)大小
ZMQ_SNDBUF屬性會對socekt參數(shù)指定的socket設(shè)置底層內(nèi)核的傳輸緩存大小,以B為單位進(jìn)行設(shè)置。設(shè)置的屬性值是0,則意味著使用OS的默認(rèn)值。你可以查看你的操作系統(tǒng)手冊來獲得SO_SNDBUF屬性更詳細(xì)的信息。
| 屬性值的類型 | int |
| 屬性值的單位 | B(字節(jié)) |
| 默認(rèn)值 | 0 |
| 可以應(yīng)用的socket類型 | 所有類型 |
ZMQ_RCVBUF:設(shè)置內(nèi)核傳輸緩沖區(qū)大小
ZMQ_RCVBUF屬性會對socekt參數(shù)指定的socket設(shè)置底層內(nèi)核的傳輸緩存大小,以B為單位進(jìn)行設(shè)置。設(shè)置的屬性值是0,則意味著使用OS的默認(rèn)值。你可以查看你的操作系統(tǒng)手冊來獲得SO_RCVBUF屬性更詳細(xì)的信息。
| 屬性值的類型 | int |
| 屬性值的單位 | B(字節(jié)) |
| 默認(rèn)值 | 0 |
| 可以應(yīng)用的socket類型 | 所有類型 |
ZMQ_LINGER:為socket關(guān)閉設(shè)置停留時間
ZMQ_LINGER屬性會給指定的socket設(shè)定關(guān)閉前的停留時間。停留時間指定了在對一個socket調(diào)用zmq_close(3)函數(shù)之后,這個socekt上即將被發(fā)送但還沒有被發(fā)送到對端的消息在內(nèi)存中繼續(xù)停留的時間。這個屬性進(jìn)而還會影響到與這個scoket相關(guān)聯(lián)的context上zmq_term(3)操作的進(jìn)行終結(jié)的結(jié)果。下面簡述了不同的行為:
屬性值 -1表示無限的停留時間。還沒被發(fā)送的消息在socket調(diào)用zmq_close()操作之后不會被丟棄;試圖使用zmq_term()操作對context進(jìn)行終結(jié)的操作會被阻塞,直到所有沒有被發(fā)送的消息被發(fā)往對端為止。
屬性值0 表示沒有停留時間。當(dāng)使用zmq_close()函數(shù)將socket關(guān)閉的時候,所有沒有被發(fā)送呃消息都會被丟棄。
屬性是正數(shù)值表示設(shè)置一個毫秒為單位的停留時間。在第socket調(diào)用zmq_close()操作后,還沒有發(fā)送的消息不會被丟棄;試圖使用zmq_term()對于此scoket相關(guān)聯(lián)的context進(jìn)行終結(jié)的時候會被阻塞,直到所有未被發(fā)送的消息都被發(fā)往對端;或者停留時間已經(jīng)到達(dá),此時所有未發(fā)送的消息都會被丟棄。
| 屬性值的類型 | int |
| 屬性值的單位 | 毫秒 |
| 默認(rèn)值 | -1 |
| 可以應(yīng)用的socket類型 | 所有類型 |
ZMQ_RECONNECT_IVL:設(shè)置重連間隔
ZMQ_RECONNECT_IVL屬性會設(shè)置指定的scoket的初始套接字重連間隔。重連間隔是使用面向連接的傳輸方式的時候,當(dāng)與對端的鏈接斷開后,嘗試再次進(jìn)行連接時的ZMQ周期。屬性值是 -1表示不進(jìn)行重連。
ZMQ中的重連間隔可能是個隨機的較大數(shù)值,以防在拓?fù)浣Y(jié)構(gòu)中重連風(fēng)暴的發(fā)生。| 屬性值的類型 | int |
| 屬性值的單位 | 毫秒 |
| 默認(rèn)值 | 100 |
| 可以應(yīng)用的socket類型 | 當(dāng)使用面向連接的傳輸方式時,所有類型 |
ZMQ_RECONNECT_IVL_MAX:設(shè)置重連間隔的最大值
ZMQ_RECONNECT_IVL_MAX屬性會設(shè)置指定的scoket的重連間隔最大值。這是在ZMQ重連周期之間的最大值。在每次的重連企圖中,重連間隔值都會是前一次的兩倍,知道達(dá)到ZMQ_RECONNECT_IVL_MAX值。這允許指數(shù)補償策略。默認(rèn)值表示不執(zhí)行指數(shù)補償策略,并且重連間隔時間只基于ZMQ_RECONNECT_IVL進(jìn)行計算。
| 屬性值的類型 | int |
| 屬性值的單位 | 毫秒 |
| 默認(rèn)值 | 0(只使用ZMQ_RECONNECT_IVL) |
| 可以應(yīng)用的socket類型 | 當(dāng)使用面向連接的傳輸方式時,所有類型 |
ZMQ_BACKLOG:設(shè)置向外發(fā)起的連接隊列的最大長度
ZMQ_BACKLOG屬性會設(shè)置指定的socket的每一個向外連接隊列的最大長度;這只對面向連接的傳輸方式起作用。要查看更多細(xì)節(jié)請查看你的操作系統(tǒng)的文檔中l(wèi)isten函數(shù)。
| 屬性值的類型 | int |
| 屬性值的單位 | 連接 |
| 默認(rèn)值 | 1000 |
| 可以應(yīng)用的socket類型 | 當(dāng)使用面向連接的傳輸方式時,所有類型 |
ZMQ_MAXMSGSIZE:可接受的最大進(jìn)入消息的大小
限制進(jìn)入的消息的大小。如果一端發(fā)送了一條消息比ZMQ_MAXMSGSIZE大,就會斷開連接。屬性值是 -1表示沒有限制。
| 屬性值的類型 | int64_t |
| 屬性值的單位 | B(字節(jié)) |
| 默認(rèn)值 | -1 |
| 可以應(yīng)用的socket類型 | 所有類型 |
ZMQ_MULTICAST_HOPS:多播數(shù)據(jù)包時候的最大網(wǎng)絡(luò)中繼
設(shè)置從這個socket發(fā)送出去的多播數(shù)據(jù)包的存活時間默認(rèn)值是1,表示這個多播包不能離開本地網(wǎng)絡(luò)。
| 屬性值的類型 | int |
| 屬性值的單位 | 網(wǎng)絡(luò)中繼數(shù) |
| 默認(rèn)值 | 1 |
| 可以應(yīng)用的socket類型 | 當(dāng)使用面向連接的傳輸方式時,所有類型 |
ZMQ_RCVTIMEO:在一個recv操作返回EAGAIN錯誤前的最大時間
設(shè)置socket的接收操作超時時間。如果屬性值是0,zmq_recv(3)函數(shù)將會立刻返回,如果沒有接收到任何消息,將會返回EAGAIN錯誤。如果屬性值是 -1,將會阻塞,直到接收到消息為止。對于任何其它值,都會進(jìn)行等待這么多時間,直到返回EAGAIN錯誤。
| 屬性值的類型 | int |
| 屬性值的單位 | 毫秒 |
| 默認(rèn)值 | -1(無限等待) |
| 可以應(yīng)用的socket類型 | 所有類型 |
ZMQ_SNDTIMEO:在一個發(fā)送操作返回EAGAIN之前等待的最大時間
設(shè)置指定socket的發(fā)送超時。如果屬性值是0,zmq_send(3)函數(shù)會立即返回,如果無法發(fā)送此消息,則返回EAGAIN錯誤值。如果屬性值是 -1,那么在消息發(fā)送之前會進(jìn)入阻塞模式。對于所有其它的值,將會在超時時間內(nèi)進(jìn)行嘗試發(fā)送消息,超時后返回EAGAIN錯誤。
| 屬性值的類型 | int |
| 屬性值的單位 | 毫秒 |
| 默認(rèn)值 | -1(無限等待) |
| 可以應(yīng)用的socket類型 | 所有類型 |
ZMQ_IPV6:在socket上允許使用IPv6
設(shè)置此socket的IPv6屬性。屬性值是1表示IPv6在此socket上可以使用,而屬性值是0表示此socket上只能使用IPv4。當(dāng)socket上允許使用IPv6的時候,這個scoket可以IPv4或者IPv6進(jìn)行連接或者接受連接。
| 屬性值的類型 | int |
| 屬性值的單位 | 布爾 |
| 默認(rèn)值 | 0(false) |
| 可以應(yīng)用的socket類型 | 當(dāng)使用TCP連接的時候,所有類型可用 |
ZMQ_IPV4ONLY:在socket上只使用IPv4
設(shè)置只使用IPv4屬性。不贊成使用這個屬性。請使用ZMQ_IPV6屬性。
| 屬性值的類型 | int |
| 屬性值的單位 | 布爾 |
| 默認(rèn)值 | 1(true) |
| 可以應(yīng)用的socket類型 | 當(dāng)使用TCP連接的時候,所有類型可用 |
ZMQ_IMMEDIATE:隊列消息只作用于已完成的鏈接
默認(rèn)情況下,消息隊列在及時連接沒有完全建立的時候也會向外發(fā)送消息。這會導(dǎo)致使用循環(huán)路由的scoket(REQ,PUSH,DEALER)消息“丟失”。如果屬性值設(shè)置為1,消息只會在連接已經(jīng)建立完成的時候才會進(jìn)行發(fā)送。這回導(dǎo)致當(dāng)另一方?jīng)]有連接的時候出現(xiàn)阻塞的情況,但是可以防止消息隊列在等待連接的時候填充管道。
| 屬性值的類型 | int |
| 屬性值的單位 | 布爾 |
| 默認(rèn)值 | 0(false) |
| 可以應(yīng)用的socket類型 | 當(dāng)使用面向連接的時候,所有類型可用 |
ZMQ_ROUTER_HANDOVER:處理ROUTER socket上的每一個身份ID名沖突
設(shè)置當(dāng)ROUTER socket遇到同名身份ID時的行為。默認(rèn)情況下,當(dāng)兩個對頓使用相同的身份ID連接到同一個ROUTER socket上的時候,結(jié)果是不確定的。屬性值是1表示會使ROUTER scoket遇到身份ID沖突的時候進(jìn)行身份ID的重新分配。特別的,第一次連接上來的socket將會被中介,而第二次連接上來的socket將會接收接下來所有路由給這個身份ID名的消息。
| 屬性值的類型 | int |
| 屬性值的單位 | 0,1 |
| 默認(rèn)值 | 0 |
| 可以應(yīng)用的socket類型 | ZMQ_ROUTER |
ZMQ_ROUTER_MANDATORY:在ROUTER socket上只接收可以進(jìn)行路由的消息
設(shè)置ROUTER socket收到無法路由的消息時的行為。默認(rèn)屬性值是0,表示會靜默的丟棄不能路由到的消息。屬性值是1時,如果消息不能路由,會返回一個EHOSTUNREACH錯誤代碼。
| 屬性值的類型 | int |
| 屬性值的單位 | 0,1 |
| 默認(rèn)值 | 0 |
| 可以應(yīng)用的socket類型 | ZMQ_ROUTER |
ZMQ_ROUTER_RAW:轉(zhuǎn)換ROUTER socket到原始模式
當(dāng)設(shè)置為1的時候,及把ROUTER 設(shè)置為原始模式。當(dāng)ROUTER為原始模式并且在使用tcp://傳輸方式的時候,將不會以ZMQ格式讀取和寫入TCP數(shù)據(jù)。這就使ZMQ應(yīng)用程序可以和非ZMQ程序進(jìn)行交流。當(dāng)使用原始模式的時候,你不能使用明確的身份ID,并且在發(fā)送消息的時候ZMQ_MSGMORE標(biāo)志也會被忽略。在原始模式下,你可以采用在發(fā)送了一個明確的身份ID后,緊跟著發(fā)送一個空消息來關(guān)閉一個指定的連接。
不建議使用這個選項,請使用ZMQ_STREAM 類型的socket來代替。| 屬性值的類型 | int |
| 屬性值的單位 | 0,1 |
| 默認(rèn)值 | 0 |
| 可以應(yīng)用的socket類型 | ZMQ_ROUTER |
ZMQ_PROBE_ROUTER:ROUTER socket 的引導(dǎo)連接
當(dāng)次屬性設(shè)置為1的時候,如果有閑的連接建立了或者接受了新的連接,這個scoket就會自動發(fā)送一個空的消息。你可以在連接到ROUTER socket的REQ、DEALER或者ROUTER socket上設(shè)置這個屬性。這些應(yīng)用程序必須能夠區(qū)分這個空消息。ZMQ_PROBE_ROUTER屬性實際上給ROUTER應(yīng)用程序提供了一個信號信號,說明一個新的對端活著。
不要在一個向任何socket類型進(jìn)行會話的socket上設(shè)置此屬性:結(jié)果是未知的。| 屬性值的類型 | int |
| 屬性值的單位 | 0,1 |
| 默認(rèn)值 | 0 |
| 可以應(yīng)用的socket類型 | ZMQ_ROUTER,ZMQ_DEALER,ZMQ_REQ |
ZMQ_XPUB_VERBOSE:提供XPUB socket上的所有訂閱消息
設(shè)置XPUB socket在新的訂閱和取消訂閱時的行為。默認(rèn)屬性值是0,并且只允許新的訂閱消息通過傳輸?shù)缴嫌巍傩灾凳?表示允許所有的訂閱信息通過傳輸?shù)缴嫌巍?/p>
| 屬性值的類型 | int |
| 屬性值的單位 | 0,1 |
| 默認(rèn)值 | 0 |
| 可以應(yīng)用的socket類型 | ZMQ_XPUB |
ZMQ_REQ_CORRELATE:匹配請求回復(fù)
REQ scoket的默認(rèn)行為是依靠消息的次序進(jìn)行請求和回復(fù)的匹配,并且這種方式一般情況下也是足夠用的。當(dāng)這個屬性值設(shè)置成1的時候,REQ socket 會在向外發(fā)送的消息前面加上一個請求ID幀前綴。這就意味著整個消息的結(jié)構(gòu)是(請求ID,0,用戶幀)。REQ socket會丟棄所有不是以這兩個幀作為開始的消息。
| 屬性值的類型 | int |
| 屬性值的單位 | 0,1 |
| 默認(rèn)值 | 0 |
| 可以應(yīng)用的socket類型 | ZMQ_REQ |
ZMQ_REQ_RELAXED:放松請求和回復(fù)之間嚴(yán)格的輪換
默認(rèn)情況下,REQ socket 不允許在接收到上一個回復(fù)之前使用zmq_send(3)開始一個新的請求。當(dāng)這個屬性值設(shè)置為1的時候,會允許發(fā)送另一個請求,并且結(jié)果是斷開與期望回復(fù)消息端的底層的鏈接,在支持重連的傳輸協(xié)議里,會觸發(fā)一個重連的嘗試。請求-回復(fù)狀態(tài)被重置,并且一個新的請求會發(fā)送到下一個可用的對端上。
如果設(shè)置此屬性值為1,應(yīng)該同時設(shè)置ZMQ_REQ_CORRELATE可用,以確保對請求和回復(fù)的正確匹配。否則,如果一個已經(jīng)被斷開的鏈接發(fā)來一個遲來的回復(fù),可能會被認(rèn)作后來的請求的回復(fù)。
| 屬性值的類型 | int |
| 屬性值的單位 | 0,1 |
| 默認(rèn)值 | 0 |
| 可以應(yīng)用的socket類型 | ZMQ_REQ |
ZMQ_TCP_KEEPALIVE:代替SO_KEEPALIVE屬性
代替了SO_KEEPALIVE屬性。默認(rèn)值是 -1,表示跳過所有的重寫操作,并且把這些屬性值交給操作系統(tǒng)。
| 屬性值的類型 | int |
| 屬性值的單位 | -1, 0,1 |
| 默認(rèn)值 | -1(使用操作系統(tǒng)的值) |
| 可以應(yīng)用的socket類型 | 當(dāng)使用TCP連接的時候,所有類型可用 |
ZMQ_TCP_KEEPALIVE_IDLE:代替TCP_KEEPCNT(有些操作系統(tǒng)上是TCP_KEEPALIVE)屬性
代替TCP_KEEPCNT(有些操作系統(tǒng)上是TCP_KEEPALIVE)屬性(當(dāng)操作系統(tǒng)支持的時候)。默認(rèn)值是 -1,表示跳過所有的重寫操作,并且把這些屬性值交給操作系統(tǒng)。
| 屬性值的類型 | int |
| 屬性值的單位 | -1, ?> 0 |
| 默認(rèn)值 | -1(使用操作系統(tǒng)的值) |
| 可以應(yīng)用的socket類型 | 當(dāng)使用TCP連接的時候,所有類型可用 |
ZMQ_TCP_KEEPALIVE_CNT:代替TCP_KEEPCNT socket屬性
代替TCP_KEEPCNT socket屬性(當(dāng)操作系統(tǒng)支持的時候)。默認(rèn)值是 -1,表示跳過所有的重寫操作,并且把這些屬性值交給操作系統(tǒng)。
| 屬性值的類型 | int |
| 屬性值的單位 | -1,? > 0 |
| 默認(rèn)值 | -1(使用操作系統(tǒng)的值) |
| 可以應(yīng)用的socket類型 | 當(dāng)使用TCP連接的時候,所有類型可用 |
ZMQ_TCP_KEEPALIVE_INTVL:代替TCP_KEEPINTVL socket 屬性
代替TCP_KEEPINTVL socket 屬性(當(dāng)操作系統(tǒng)支持的時候)。默認(rèn)值是 -1,表示跳過所有的重寫操作,并且把這些屬性值交給操作系統(tǒng)。
| 屬性值的類型 | int |
| 屬性值的單位 | -1,? > 0 |
| 默認(rèn)值 | -1(使用操作系統(tǒng)的值) |
| 可以應(yīng)用的socket類型 | 當(dāng)使用TCP連接的時候,所有類型可用 |
ZMQ_TCP_ACCEPT_FILTER:為新連上來的TCP連接分配過濾器
在一個監(jiān)聽socket上分配一個任意的過濾器會作用于每一個新連接上來的TCP鏈接。如果沒有使用任何過濾器,TCP傳輸會允許任意的IP地址連接上來。如果設(shè)置了至少一個過濾器,那么新連接上來的源ip就需要能夠匹配。向情況所有的過濾器,請調(diào)用zmq_setsockopt(socket, ZMQ_TCP_ACCEPT_FILTER, NULL, 0)。過濾器是一個以空字節(jié)結(jié)尾的IPv6或IPv4 CIDR(無類域間路由)。
| 屬性值的類型 | 二進(jìn)制數(shù)據(jù) |
| 屬性值的單位 | N/A |
| 默認(rèn)值 | 無過濾(允許任何地方來的) |
| 可以應(yīng)用的socket類型 | 當(dāng)使用TCP連接的時候,所有監(jiān)聽socket |
ZMQ_PLAIN_SERVER:設(shè)置PLAIN 服務(wù)的角色
定義一個socket是否作為PLAIN 安全方式的服務(wù)端,參見zmq_plain(7)。設(shè)置屬性值為1表示這個scoket將會作為PLAIN的服務(wù)端。屬性值設(shè)置為0表示這個socket不作為PLAIN服務(wù)端,并且它的安全方式依賴于其它的屬性設(shè)置。設(shè)置此屬性為0會重置這個scoket的安全方式為NULL。
| 屬性值的類型 | int |
| 屬性值的單位 | 0,1 |
| 默認(rèn)值 | 0 |
| 可以應(yīng)用的socket類型 | 當(dāng)使用TCP連接的時候,所有類型可用 |
ZMQ_PLAIN_USERNAME:設(shè)置PLAIN安全方式的用戶名
設(shè)置TCP或者IPC對外連接的用戶名。如果你設(shè)置這個屬性為非空值,用于連接的安全機制會是PLAIN,參見zmq_plain(7)。如果你設(shè)置此屬性值為空值,用于連接的安全機制會是NULL,參見zmq_null(3)。
| 屬性值的類型 | 特征字符串 |
| 屬性值的單位 | N/A |
| 默認(rèn)值 | 不設(shè)置 |
| 可以應(yīng)用的socket類型 | 當(dāng)使用TCP連接的時候,所有類型可用 |
ZMQ_PLAIN_PASSWORD:設(shè)置PLAIN安全方式的密碼
設(shè)置TCP或者IPC對外連接的密碼。如果你設(shè)置這個屬性為非空值,用于連接的安全機制會是PLAIN,參見zmq_plain(7)。如果你設(shè)置此屬性值為空值,用于連接的安全機制會是NULL,參見zmq_null(3)。
| 屬性值的類型 | 特征字符串 |
| 屬性值的單位 | N/A |
| 默認(rèn)值 | 不設(shè)置 |
| 可以應(yīng)用的socket類型 | 當(dāng)使用TCP連接的時候,所有類型可用 |
ZMQ_CURVE_SERVER:設(shè)置CURVE服務(wù)端角色
定義一個socket是否為CURVE 安全方式的服務(wù)端,參見zmq_curve(7)。屬性值是1表示這個 socket將會作為一個CURVE服務(wù)端。屬性值是0表示這個socket將不會作為CURVE客戶端,并且其安全方式的角色將會依賴于其它屬性設(shè)置。設(shè)置此屬性值為0將會重置此socket的安全方式為NULL。如果你設(shè)置這個屬性,你必須使用ZMQ_CURVE_SECRETKEY屬性設(shè)置這個服務(wù)端的秘鑰。一個服務(wù)端socket不需要知道它自己的公鑰。
| 屬性值的類型 | int |
| 屬性值的單位 | 0, 1 |
| 默認(rèn)值 | 0 |
| 可以應(yīng)用的socket類型 | 當(dāng)使用TCP連接的時候,所有類型可用 |
ZMQ_CURVE_PUBLICKEY:設(shè)置CURVE公鑰
設(shè)置socket的長期公鑰。你必須設(shè)置CURVE客戶端的這個屬性,參見zmq_curve(7)。你可以用32位二進(jìn)制字節(jié)或者經(jīng)過Z85格式加密后的40字符串。這個公鑰必須和秘鑰匹配使用。可以使用zmq_curve_keypair(3)函數(shù)生成一個公鑰/密鑰對。
| 屬性值的類型 | 二進(jìn)制數(shù)據(jù)或者Z85格式的文本字符串 |
| 屬性值的單位 | 32或者40 |
| 默認(rèn)值 | NULL |
| 可以應(yīng)用的socket類型 | 當(dāng)使用TCP連接的時候,所有類型可用 |
ZMQ_CURVE_SECRETKEY:設(shè)置CURVE密鑰
這是此socket的長期密鑰。你必須在CURVE客戶端和服務(wù)端上都設(shè)置此屬性,參見zmq_curve(7)。你可以用32位二進(jìn)制字節(jié)或者經(jīng)過Z85格式加密后的40字符串。這個公鑰必須和秘鑰匹配使用。可以使用zmq_curve_keypair(3)函數(shù)生成一個公鑰/密鑰對。
| 屬性值的類型 | 二進(jìn)制數(shù)據(jù)或者Z85格式的文本字符串 |
| 屬性值的單位 | 32或者40 |
| 默認(rèn)值 | NULL |
| 可以應(yīng)用的socket類型 | 當(dāng)使用TCP連接的時候,所有類型可用 |
ZMQ_CURVE_SERVERKEY:設(shè)置CURVE服務(wù)端碼
設(shè)置此socket的長期服務(wù)端碼。你必須在客戶端socket上設(shè)置此服務(wù)端碼,參見zmq_curve(7)。你可以用32位二進(jìn)制字節(jié)或者經(jīng)過Z85格式加密后的40字符串。這個公鑰必須和秘鑰匹配使用。這個碼必須是服務(wù)端生成密鑰的時候一塊生成的。
| 屬性值的類型 | 二進(jìn)制數(shù)據(jù)或者Z85格式的文本字符串 |
| 屬性值的單位 | 32或者40 |
| 默認(rèn)值 | NULL |
| 可以應(yīng)用的socket類型 | 當(dāng)使用TCP連接的時候,所有類型可用 |
ZMQ_ZAP_DOMAIN:設(shè)置RFC 27認(rèn)證域
設(shè)置ZAP(ZMQ RFC 27)認(rèn)證域。對于空的安全方式(默認(rèn)在所有的tcp://連接上),ZAP認(rèn)證只在你設(shè)置一個非空的域時起作用。對于PLAIN和CURVE安全方式,如果有ZAP處理程序存在,總是會請求ZAP。參見http://rfc.zeromq.org/spec:27?獲取更多細(xì)節(jié)。
| 屬性值的類型 | 字符串 |
| 屬性值的單位 | N/A |
| 默認(rèn)值 | 不設(shè)置 |
| 可以應(yīng)用的socket類型 | 當(dāng)使用TCP連接的時候,所有類型可用 |
ZMQ_CONFLATE:只保留最后到來的消息
如果設(shè)置了這個值,socket只會在其入站/出站隊列中保留一個消息,那就是最后一個接收到的消息,或者最后一個要發(fā)送的消息。設(shè)置此屬性會忽略ZMQ_RECVHWM屬性和ZMQ_SENDHWM屬性。不支持多幀消息,特別的,在socket的內(nèi)部消息隊列中,只有一個幀會被保留。
| 屬性值的類型 | int |
| 屬性值的單位 | 布爾 |
| 默認(rèn)值 | 0(false) |
| 可以應(yīng)用的socket類型 | ZMQ_PULL, ZMQ_PUSH, ZMQ_SUB, ZMQ_PUB, ZMQ_DEALER |
Return value
如果執(zhí)行成功,zmq_setsockopt()函數(shù)會返回0。否則會返回 -1,并且設(shè)置errno為下列定義值中的一個。
Errors
EINVAL
請求的屬性中,屬性名稱為止,或者屬性長度或者屬性值不可用。
ETERM
和指定socket相關(guān)的context已經(jīng)被終結(jié)了
ENOTSOCK
參數(shù)提供的socket不可用
EINTR
本次操作被信號中斷了
Example
在一個ZMQ_SUB? socket上設(shè)置訂閱消息
/* Subscribe to all messages */ rc = zmq_setsockopt (socket, ZMQ_SUBSCRIBE, "", 0); assert (rc == 0); /* Subscribe to messages prefixed with "ANIMALS.CATS" */rc = zmq_setsockopt (socket, ZMQ_SUBSCRIBE, "ANIMALS.CATS", 12);設(shè)置I/O線程關(guān)聯(lián)
int64_t affinity; /* Incoming connections on TCP port 5555 shall be handled by I/O thread 1 */ affinity = 1; rc = zmq_setsockopt (socket, ZMQ_AFFINITY, &affinity, sizeof (affinity)); assert (rc); rc = zmq_bind (socket, "tcp://lo:5555"); assert (rc); /* Incoming connections on TCP port 5556 shall be handled by I/O thread 2 */ affinity = 2; rc = zmq_setsockopt (socket, ZMQ_AFFINITY, &affinity, sizeof (affinity)); assert (rc); rc = zmq_bind (socket, "tcp://lo:5556"); assert (rc);See also
zmq_getsockopt(3) ?zmq_socket(3) ?zmq_plain(7) ?zmq_curve(7) ?zmq(7)
Authors
This page was written by the ?MQ community. To make a change please read the ?MQ Contribution Policy at?http://www.zeromq.org/docs:contributing.
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
總結(jié)
以上是生活随笔為你收集整理的ZeroMQ接口函数之 :zmq_setsockopt –设置ZMQ socket的属性的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python解决爬虫中文返回乱码问题
- 下一篇: shell判断是否为root权限(id