資源簡介
c語言利用RDMA 實現客戶端和服務器端發送接收消息。包含server.c和client.c ,gcc編譯方法和使用方法

代碼片段和文件信息
#include?
#include?
#include?
#include?
#include?
#include?
#define?TEST_NZ(x)?do?{?if?(?(x))?die(“error:?“?#x?“?failed?(returned?non-zero).“?);?}?while?(0)
#define?TEST_Z(x)??do?{?if?(!(x))?die(“error:?“?#x?“?failed?(returned?zero/null).“);?}?while?(0)
const?int?BUFFER_SIZE?=?1024;//單位為字節,此時大小為1KB
const?int?TIMEOUT_IN_MS?=?500;?/*?ms?*/
struct?context?{
??struct?ibv_context?*ctx;
??struct?ibv_pd?*pd;
??struct?ibv_cq?*cq;
??struct?ibv_comp_channel?*comp_channel;
??pthread_t?cq_poller_thread;
};
struct?connection?{
??struct?rdma_cm_id?*id;
??struct?ibv_qp?*qp;
??struct?ibv_mr?*recv_mr;
??struct?ibv_mr?*send_mr;
??char?*recv_region;
??char?*send_region;
??int?num_completions;
};
static?void?die(const?char?*reason);
static?void?build_context(struct?ibv_context?*verbs);
static?void?build_qp_attr(struct?ibv_qp_init_attr?*qp_attr);
static?void?*?poll_cq(void?*);
static?void?post_receives(struct?connection?*conn);
static?void?register_memory(struct?connection?*conn);//注冊內存
static?int?on_addr_resolved(struct?rdma_cm_id?*id);
static?void?on_completion(struct?ibv_wc?*wc);
static?int?on_connection(void?*context);
static?int?on_disconnect(struct?rdma_cm_id?*id);
static?int?on_event(struct?rdma_cm_event?*event);
static?int?on_route_resolved(struct?rdma_cm_id?*id);
static?struct?context?*s_ctx?=?NULL;
int?main(int?argc?char?**argv)
{
??struct?addrinfo?*addr;
??struct?rdma_cm_event?*event?=?NULL;
??struct?rdma_cm_id?*conn=?NULL;
??struct?rdma_event_channel?*ec?=?NULL;
??if?(argc?!=?3)
????die(“usage:?client??“);
??TEST_NZ(getaddrinfo(argv[1]?argv[2]?NULL?&addr));//addr指針參數返回一個指向addrinfo結構鏈表的指針
??TEST_Z(ec?=?rdma_create_event_channel());//創建通道,有連接請求時,用來通知應用程序的通道
??TEST_NZ(rdma_create_id(ec?&conn?NULL?RDMA_PS_TCP));//創建了rdma_cm_id對象,并將其注冊到驅動中。類似與套接字
??TEST_NZ(rdma_resolve_addr(conn?NULL?addr->ai_addr?TIMEOUT_IN_MS));//綁定一個特定的地址
??freeaddrinfo(addr);
??while?(rdma_get_cm_event(ec?&event)?==?0)?{//判斷有通道,正常情況下,會得到一個事件,也就是客戶端發起連接
????struct?rdma_cm_event?event_copy;
????memcpy(&event_copy?event?sizeof(*event));
????rdma_ack_cm_event(event);
????if?(on_event(&event_copy))
??????break;
??}
??rdma_destroy_event_channel(ec);
??return?0;
}
void?die(const?char?*reason)
{
??fprintf(stderr?“%s\n“?reason);
??exit(EXIT_FAILURE);
}
void?build_context(struct?ibv_context?*verbs)
{
??if?(s_ctx)?{
????if?(s_ctx->ctx?!=?verbs)
??????die(“cannot?handle?events?in?more?than?one?context.“);
????return;
??}
??s_ctx?=?(struct?context?*)malloc(sizeof(struct?context));
??s_ctx->ctx?=?verbs;
??TEST_Z(s_ctx->pd?=?ibv_alloc_pd(s_ctx->ctx));
??TEST_Z(s_ctx->comp_channel?=?ibv_create_comp_channel(s_ctx->ctx));
??TEST_Z(s_ctx->cq?=?ibv_create_cq(s_ctx->ctx?10?NULL?s_ctx->comp_channel?0));?/*?cqe=10?is?arbitrary?*/
??TEST_NZ(ibv_req_notify_cq(s_ctx->cq?0));
??TEST_NZ(pthread_create(&s_ctx->cq_poller_thread?NULL?poll_cq?NULL));
}
void?build_qp_attr(struc
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件???????7395??2019-03-18?16:14??RDMA-basic-client-server\client.c
?????文件?????????51??2019-04-10?22:08??RDMA-basic-client-server\gcc編譯.txt
?????文件????????150??2018-07-05?10:40??RDMA-basic-client-server\Makefile
?????文件???????8505??2018-11-09?16:41??RDMA-basic-client-server\server.c
?????文件?????????58??2019-04-10?22:11??RDMA-basic-client-server\使用方法.txt
?????目錄??????????0??2019-04-10?22:10??RDMA-basic-client-server
-----------?---------??----------?-----??----
????????????????16159????????????????????6
評論
共有 條評論