rabbitmq-c是乙個用於c語言的,與amqp server進行互動的client庫,amqp協議為版本0-9-1。rabbitmq-c與server進行互動前需要首先進行login操作,在操作後,可以根據amqp協議規範,執行一系列操作。
這裡,根據專案需求,只進行部分介面說明,文後附demo的github位址。
介面描述:
amqp_connection_state_t amqp_new_connection(void);
介面說明:宣告乙個新的amqp connection
int amqp_open_socket(char const *hostname, int portnumber);
介面說明:獲取socket.
引數說明:hostname rabbitmq server所在主機
portnumber rabbitmq server監聽埠
void amqp_set_sockfd(amqp_connection_state_t state,int sockfd);
介面說明:將amqp connection和sockfd進行繫結
amqp_rpc_reply_t amqp_login(amqp_connection_state_t state, char const *vhost,int channel_max,int frame_max,int heartbeat,amqp_sasl_method_enum sasl_method, ...);
介面說明:用於登入rabbitmq server,主要目的為了進行許可權管理;
引數說明:state amqp connection
vhost rabbit-mq的虛機主機,是rabbit-mq進行許可權管理的最小單位
channel_max 最大鏈結數,此處設成0即可
frame_max 和客戶端通訊時所允許的最大的frame size.預設值為131072,增大這個值有助於提高吞吐,降低這個值有利於降低時延
heartbeat 含義未知,預設值填0
sasl_method 用於ssl鑑權,預設值參考後文demo
amqp_channel_open_ok_t *amqp_channel_open(amqp_connection_state_t state, amqp_channel_t channel);
介面說明:用於關聯conn和channel
amqp_exchange_declare_ok_t *amqp_exchange_declare(amqp_connection_state_t state, amqp_channel_t channel, amqp_bytes_t exchange, amqp_bytes_t type, amqp_boolean_t passive, amqp_boolean_t durable, amqp_table_t arguments);
介面說明:宣告declare
引數說明:state
channel
exchange
type "fanout" "direct" "topic"三選一
passive
curable
arguments
amqp_queue_declare_ok_t *amqp_queue_declare(amqp_connection_state_t state, amqp_channel_t channel, amqp_bytes_t queue, amqp_boolean_t passive, amqp_boolean_t durable, amqp_boolean_t exclusive, amqp_boolean_t auto_delete, amqp_table_t arguments);
介面說明:宣告queue
引數說明:state amqp connection
channel
queue queue name
passive
durable 佇列是否持久化
exclusive 當前連線不在時,佇列是否自動刪除
aoto_delete 沒有consumer時,佇列是否自動刪除
arguments 用於拓展引數,比如x-ha-policy用於mirrored queue
amqp_queue_bind_ok_t *amqp_queue_bind(amqp_connection_state_t state, amqp_channel_t channel, amqp_bytes_t queue, amqp_bytes_t exchange, amqp_bytes_t routing_key, amqp_tab le_t arguments);
介面說明:宣告binding
amqp_basic_qos_ok_t *amqp_basic_qos(amqp_connection_state_t state, amqp_channel_t channel, uint32_t prefetch_size, uint16_t prefetch_count, amqp_boolean_t global);
介面說明:qos是 quality of service,我們這裡使用主要用於控制預取訊息數,避免訊息按條數均勻分配,需要和no_ack配合使用
引數說明:state
channel
prefetch_size 以bytes為單位,0為unlimited
prefetch_count 預取的訊息條數
global
amqp_basic_consume_ok_t *amqp_basic_consume(amqp_connection_state_t state, amqp_channel_t channel, amqp_bytes_t queue, amqp_bytes_t consumer_tag, amqp_boolean_t no_local, amqp_boolean_t no_ack, amqp_boolean_t exclusive, amqp_table_t arguments);
介面說明:開始乙個queue consumer
引數說明:state
channel
queue
consumer_tag
no_local
no_ack 是否需要確認訊息後再從佇列中刪除訊息
exclusive
arguments
int amqp_basic_ack(amqp_connection_state_t state,amqp_channel_t channel,uint64_t delivery_tag,amqp_boolean_t multiple);
int amqp_basic_publish(amqp_connection_state_t state,amqp_channel_t channel,amqp_bytes_t exchange,amqp_bytes_t routing_key,amqp_boolean_t mandatory,amqp_boolean_t immediate,struct amqp_basic_properties_t_ const *properties,amqp_bytes_t body);
介面說明:發布訊息
引數說明:state
channel
exchange
routing_key 當exchange為預設「」時,此處填寫queue_name,當exchange為direct,此處為binding_key
mandatory 參見參考文獻2
immediate 同上
properties 更多屬性,如何設定訊息持久化,參見文後demo
body 訊息體
amqp_rpc_reply_t amqp_channel_close(amqp_connection_state_t state,amqp_channel_t channel,int code);
amqp_rpc_reply_t amqp_connection_close(amqp_connection_state_t state,int code);
int amqp_destroy_connection(amqp_connection_state_t state);
如何consume訊息,參見文後demo。
其中 rmq_new_task.c和rmq_worker.c對應於rabbitmq tutorial裡的work queues章節(和receive_logs_direct.c對應於rabbitmq tutorial裡的routing章節(這兩個demo覆蓋了rabbitmq的常用應用場景。
編譯需要librabbitmq.a庫,同時需要rabbitmq-c提供的幾個標頭檔案(amqp.h和amqp_framing.h)以及utils.c檔案,這些在github project頁面均可獲得。
rabbitmq-c主頁
使用tcp select實現客戶端與客戶端的通訊
使用多路復用實現客戶端與客戶端進行通訊 原理 客戶端只要一連上伺服器,立馬給伺服器傳送使用者名稱,然後在服務端將newsocketfd 存放在同乙個結構體中,客戶端先給伺服器傳送資料,然後通過伺服器 給客戶端。伺服器先會查詢對應名字的 newsocketfd 然後向該 newsocketfd 中寫入...
瘦客戶端 胖客戶端 智慧型客戶端
胖客戶端模式將應用程式處理分成了兩部分 由使用者的桌面計算機執行的處理和最適合乙個集中的伺服器執行的處理。乙個典型的胖客戶端包含乙個或多個在使用者的pc上執行的應用程式,使用者可以檢視並運算元據 處理一些或所有的業務規則 同時提供乙個豐富的使用者介面做出響應。伺服器負責管理對資料的訪問並負責執行一些...
msysgit(git 客戶端使用)
3 在學習git基本命令 本地操作 發布github 遠端倉庫等 4 遇到的問題 ssh t github github.com 提示connection refused port 22 的錯誤 解決方法 在 ssh目錄下增加配置檔案 config 內容 host user abc123 hostn...