content_views"
c lass="markdown_views prism-atom-one-dark">
cap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-bloc k" style="-webkit-tap-highlight-c olor: rgba(0, 0, 0, 0);">
c lass="tags" href="/tags/RDMA.html" title=RDMA>RDMA_0">c lass="tags" href="/tags/RDMA.html" title=RDMA>RDMA编程实践
本文描述了c lass="tags" href="/tags/RDMA.html" title=RDMA>RDMA编程过程中的SEND-RECEIVE双边原语的代码实现。包含多个版本c ;1、c lient向server发送消息c ;server回复c lient收到消息(ACK)c ;然后两边断开连接。2、server端循环等待客户端建立连接c ;c lient发送一次消息后c ;双方断开连接。3、server端循环等待客户端建立连接c ;一旦建立c ;c lient端可以一直向server端发送消息c ;直到发送消息为disc onnec tc ;server和c lient断开链接c ;但是server此时仍然可以等待别的c lient发送消息。 代码基于代码基于c lass="tags" href="/tags/SEND-RECEIVE.html" title=send-rec eive>send-rec eive样例实现。关于代码注释c ;可以参考代码解释: Makefile文件、会编译当前目录下的所有.c 文件:
<c ode>.PHONY: all c lean
CC := gc c
CFLAGS := -Wall -g
LDLIBS := -lrdmac m -libverbs -lpthread -g
SRCS := $(wildc ard *.c )
APPS := $(SRCS:.c =)
all: $(APPS)
%: %.c
$(CC) $(CFLAGS) $< -o $@ $(LDLIBS)
c lean:
rm -f $(APPS)
c ode>
version1 客户端-服务端消息一次传递
在这个阶段c ;我们希望能实现下面这样一个场景。c lient与server端相连接c ;c lient端能够发送一条消息给serverc ;server收到该条消息之后恢复一条消息给c lient端表示我已经确认收到。之后两者断开连接。
代码:
<c ode c lass="prism language-c ">class="token c omment">// c lient1.c
class="token mac ro property">class="token direc tive-hash"># class="token direc tive keyword">inc lude class="token string"><stdio.h>
class="token mac ro property">class="token direc tive-hash"># class="token direc tive keyword">inc lude class="token string"><stdlib.h>
class="token mac ro property">class="token direc tive-hash"># class="token direc tive keyword">inc lude class="token string"><string.h>
class="token mac ro property">class="token direc tive-hash"># class="token direc tive keyword">inc lude class="token string"><netdb.h>
class="token mac ro property">class="token direc tive-hash"># class="token direc tive keyword">inc lude class="token string"><errno.h>
class="token mac ro property">class="token direc tive-hash"># class="token direc tive keyword">inc lude class="token string"><getopt.h>
class="token mac ro property">class="token direc tive-hash"># class="token direc tive keyword">inc lude class="token string"><rdma/rdma_c ma.h>
class="token mac ro property">class="token direc tive-hash"># class="token direc tive keyword">inc lude class="token string"><rdma/rdma_verbs.h>
class="token keyword">static class="token keyword">c onst class="token keyword">c har class="token operator">* server class="token operator">= class="token string">"10.10.10.1" class="token punc tuation">;
class="token keyword">static class="token keyword">c onst class="token keyword">c har class="token operator">* port class="token operator">= class="token string">"7471" class="token punc tuation">;
class="token keyword">static class="token keyword">struc t class="token c lass-name">rdma_c m_id class="token operator">* idclass="token punc tuation">;
class="token keyword">static class="token keyword">struc t class="token c lass-name">ibv_mr class="token operator">* mrclass="token punc tuation">, class="token operator">* send_mrclass="token punc tuation">;
class="token keyword">static class="token keyword">int send_flagsclass="token punc tuation">;
class="token keyword">static class="token c lass-name">uint8_t send_msgclass="token punc tuation">[ class="token number">16 class="token punc tuation">] class="token punc tuation">;
class="token keyword">static class="token c lass-name">uint8_t rec v_msgclass="token punc tuation">[ class="token number">16 class="token punc tuation">] class="token punc tuation">;
class="token keyword">static class="token keyword">int class="token func tion">run class="token punc tuation">( class="token keyword">void class="token punc tuation">)
class="token punc tuation">{
class="token keyword">struc t class="token c lass-name">rdma_addrinfo hintsclass="token punc tuation">, class="token operator">* resclass="token punc tuation">;
class="token keyword">struc t class="token c lass-name">ibv_qp_init_attr attrclass="token punc tuation">;
class="token keyword">struc t class="token c lass-name">ibv_wc wc class="token punc tuation">;
class="token keyword">int retclass="token punc tuation">;
class="token func tion">memset class="token punc tuation">( class="token operator">& hintsclass="token punc tuation">, class="token number">0 class="token punc tuation">, class="token keyword">sizeof hintsclass="token punc tuation">) class="token punc tuation">;
hintsclass="token punc tuation">. ai_port_spac e class="token operator">= c lass="tags" href="/tags/RDMA.html" title=RDMA>RDMA_PS_TCPclass="token punc tuation">;
ret class="token operator">= class="token func tion">rdma_getaddrinfo class="token punc tuation">( serverclass="token punc tuation">, portclass="token punc tuation">, class="token operator">& hintsclass="token punc tuation">, class="token operator">& resclass="token punc tuation">) class="token punc tuation">;
class="token keyword">if class="token punc tuation">( retclass="token punc tuation">) class="token punc tuation">{
class="token func tion">printf class="token punc tuation">( class="token string">"rdma_getaddrinfo: %s\n" class="token punc tuation">, class="token func tion">gai_strerror class="token punc tuation">( retclass="token punc tuation">) class="token punc tuation">) class="token punc tuation">;
class="token keyword">goto outclass="token punc tuation">;
class="token punc tuation">}
class="token func tion">memset class="token punc tuation">( class="token operator">& attrclass="token punc tuation">, class="token number">0 class="token punc tuation">, class="token keyword">sizeof attrclass="token punc tuation">) class="token punc tuation">;
attrclass="token punc tuation">. c apclass="token punc tuation">. max_send_wr class="token operator">= attrclass="token punc tuation">. c apclass="token punc tuation">. max_rec v_wr class="token operator">= class="token number">1 class="token punc tuation">;
attrclass="token punc tuation">. c apclass="token punc tuation">. max_send_sge class="token operator">= attrclass="token punc tuation">. c apclass="token punc tuation">. max_rec v_sge class="token operator">= class="token number">1 class="token punc tuation">;
attrclass="token punc tuation">. c apclass="token punc tuation">. max_inline_data class="token operator">= class="token number">16 class="token punc tuation">;
attrclass="token punc tuation">. qp_c ontext class="token operator">= idclass="token punc tuation">;
attrclass="token punc tuation">. sq_sig_all class="token operator">= class="token number">1 class="token punc tuation">;
ret class="token operator">= class="token func tion">rdma_c reate_ep class="token punc tuation">( class="token operator">& idclass="token punc tuation">, resclass="token punc tuation">, class="token c onstant">NULL class="token punc tuation">, class="token operator">& attrclass="token punc tuation">) class="token punc tuation">;
class="token c omment">// Chec k to see if we got inline data allowed or not
class="token keyword">if class="token punc tuation">( attrclass="token punc tuation">. c apclass="token punc tuation">. max_inline_data class="token operator">>= class="token number">16 class="token punc tuation">)
send_flags class="token operator">= IBV_SEND_INLINEclass="token punc tuation">;
class="token keyword">else
class="token func tion">printf class="token punc tuation">( class="token string">"rdma_c lient: devic e doesn't support IBV_SEND_INLINE, "
class="token string">"using sge sends\n" class="token punc tuation">) class="token punc tuation">;
class="token keyword">if class="token punc tuation">( retclass="token punc tuation">) class="token punc tuation">{
class="token func tion">perror class="token punc tuation">( class="token string">"rdma_c reate_ep" class="token punc tuation">) class="token punc tuation">;
class="token keyword">goto out_free_addrinfoclass="token punc tuation">;
class="token punc tuation">}
mr class="token operator">= class="token func tion">rdma_reg_msgs class="token punc tuation">( idclass="token punc tuation">, rec v_msgclass="token punc tuation">, class="token number">16 class="token punc tuation">) class="token punc tuation">;
class="token keyword">if class="token punc tuation">( class="token operator">! mrclass="token punc tuation">) class="token punc tuation">{
class="token func tion">perror class="token punc tuation">( class="token string">"rdma_reg_msgs for rec v_msg" class="token punc tuation">) class="token punc tuation">;
ret class="token operator">= class="token operator">- class="token number">1 class="token punc tuation">;
class="token keyword">goto out_destroy_epclass="token punc tuation">;
class="token punc tuation">}
class="token keyword">if class="token punc tuation">( class="token punc tuation">( send_flags class="token operator">& IBV_SEND_INLINEclass="token punc tuation">) class="token operator">== class="token number">0 class="token punc tuation">) class="token punc tuation">{
send_mr class="token operator">= class="token func tion">rdma_reg_msgs class="token punc tuation">( idclass="token punc tuation">, send_msgclass="token punc tuation">, class="token number">16 class="token punc tuation">) class="token punc tuation">;
class="token keyword">if class="token punc tuation">( class="token operator">! send_mrclass="token punc tuation">) class="token punc tuation">{
class="token func tion">perror class="token punc tuation">( class="token string">"rdma_reg_msgs for send_msg" class="token punc tuation">) class="token punc tuation">;
ret class="token operator">= class="token operator">- class="token number">1 class="token punc tuation">;
class="token keyword">goto out_dereg_rec vclass="token punc tuation">;
class="token punc tuation">}
class="token punc tuation">}
ret class="token operator">= class="token func tion">rdma_post_rec v class="token punc tuation">( idclass="token punc tuation">, class="token c onstant">NULL class="token punc tuation">, rec v_msgclass="token punc tuation">, class="token number">16 class="token punc tuation">, mrclass="token punc tuation">) class="token punc tuation">;
class="token keyword">if class="token punc tuation">( retclass="token punc tuation">) class="token punc tuation">{
class="token func tion">perror class="token punc tuation">( class="token string">"rdma_post_rec v" class="token punc tuation">) class="token punc tuation">;
class="token keyword">goto out_dereg_sendclass="token punc tuation">;
class="token punc tuation">}
ret class="token operator">= class="token func tion">rdma_c onnec t class="token punc tuation">( idclass="token punc tuation">, class="token c onstant">NULL class="token punc tuation">) class="token punc tuation">;
class="token keyword">if class="token punc tuation">( retclass="token punc tuation">) class="token punc tuation">{
class="token func tion">perror class="token punc tuation">( class="token string">"rdma_c onnec t" class="token punc tuation">) class="token punc tuation">;
class="token keyword">goto out_dereg_sendclass="token punc tuation">;
class="token punc tuation">}
class="token func tion">printf class="token punc tuation">( class="token string">"c lient send: %s\n" class="token punc tuation">, class="token punc tuation">( class="token keyword">c har class="token operator">* class="token punc tuation">) send_msgclass="token punc tuation">) class="token punc tuation">;
ret class="token operator">= class="token func tion">rdma_post_send class="token punc tuation">( idclass="token punc tuation">, class="token c onstant">NULL class="token punc tuation">, send_msgclass="token punc tuation">, class="token number">16 class="token punc tuation">, send_mrclass="token punc tuation">, send_flagsclass="token punc tuation">) class="token punc tuation">;
class="token keyword">if class="token punc tuation">( retclass="token punc tuation">) class="token punc tuation">{
class="token func tion">perror class="token punc tuation">( class="token string">"rdma_post_send" class="token punc tuation">) class="token punc tuation">;
class="token keyword">goto out_disc onnec tclass="token punc tuation">;
class="token punc tuation">}
class="token keyword">while class="token punc tuation">( class="token punc tuation">( ret class="token operator">= class="token func tion">rdma_get_send_c omp class="token punc tuation">( idclass="token punc tuation">, class="token operator">& wc class="token punc tuation">) class="token punc tuation">) class="token operator">== class="token number">0 class="token punc tuation">) class="token punc tuation">;
class="token keyword">if class="token punc tuation">( ret class="token operator">< class="token number">0 class="token punc tuation">) class="token punc tuation">{
class="token func tion">perror class="token punc tuation">( class="token string">"rdma_get_send_c omp" class="token punc tuation">) class="token punc tuation">;
class="token keyword">goto out_disc onnec tclass="token punc tuation">;
class="token punc tuation">}
class="token keyword">while class="token punc tuation">( class="token punc tuation">( ret class="token operator">= class="token func tion">rdma_get_rec v_c omp class="token punc tuation">( idclass="token punc tuation">, class="token operator">& wc class="token punc tuation">) class="token punc tuation">) class="token operator">== class="token number">0 class="token punc tuation">) class="token punc tuation">;
class="token keyword">if class="token punc tuation">( ret class="token operator">< class="token number">0 class="token punc tuation">)
class="token func tion">perror class="token punc tuation">( class="token string">"rdma_get_rec v_c omp" class="token punc tuation">) class="token punc tuation">;
class="token keyword">else
ret class="token operator">= class="token number">0 class="token punc tuation">;
class="token func tion">printf class="token punc tuation">( class="token string">"c lient rec eived: %s\n" class="token punc tuation">, class="token punc tuation">( class="token keyword">c har class="token operator">* class="token punc tuation">) rec v_msgclass="token punc tuation">) class="token punc tuation">;
out_disc onnec tclass="token operator">:
class="token func tion">rdma_disc onnec t class="token punc tuation">( idclass="token punc tuation">) class="token punc tuation">;
out_dereg_sendclass="token operator">:
class="token keyword">if class="token punc tuation">( class="token punc tuation">( send_flags class="token operator">& IBV_SEND_INLINEclass="token punc tuation">) class="token operator">== class="token number">0 class="token punc tuation">)
class="token func tion">rdma_dereg_mr class="token punc tuation">( send_mrclass="token punc tuation">) class="token punc tuation">;
out_dereg_rec vclass="token operator">:
class="token func tion">rdma_dereg_mr class="token punc tuation">( mrclass="token punc tuation">) class="token punc tuation">;
out_destroy_epclass="token operator">:
class="token func tion">rdma_destroy_ep class="token punc tuation">( idclass="token punc tuation">) class="token punc tuation">;
out_free_addrinfoclass="token operator">:
class="token func tion">rdma_freeaddrinfo class="token punc tuation">( resclass="token punc tuation">) class="token punc tuation">;
outclass="token operator">:
class="token keyword">return retclass="token punc tuation">;
class="token punc tuation">}
class="token keyword">int class="token func tion">main class="token punc tuation">( class="token keyword">int argc class="token punc tuation">, class="token keyword">c har class="token operator">* class="token operator">* argvclass="token punc tuation">)
class="token punc tuation">{
class="token keyword">int retclass="token punc tuation">;
class="token keyword">c har class="token operator">* s class="token operator">= class="token string">"hello world" class="token punc tuation">;
class="token c omment">// printf("c lient send: %s\n", s);
class="token func tion">memc py class="token punc tuation">( send_msgclass="token punc tuation">, s class="token punc tuation">, class="token func tion">strlen class="token punc tuation">( sclass="token punc tuation">) class="token punc tuation">) class="token punc tuation">;
class="token func tion">printf class="token punc tuation">( class="token string">"rdma_c lient: start\n" class="token punc tuation">) class="token punc tuation">;
ret class="token operator">= class="token func tion">run class="token punc tuation">( class="token punc tuation">) class="token punc tuation">;
class="token func tion">printf class="token punc tuation">( class="token string">"rdma_c lient: end %d\n" class="token punc tuation">, retclass="token punc tuation">) class="token punc tuation">;
class="token keyword">return retclass="token punc tuation">;
class="token punc tuation">}
c ode>
server端代码
<c ode c lass="prism language-c ">class="token c omment">// server1.c
class="token c omment">/*
* Copyright (c ) 2005-2009 Intel Corporation. All rights reserved.
*
* This software is available to you under the OpenIB.org BSD lic ense
* below:
*
* Redistribution and use in sourc e and binary forms, with or
* without modific ation, are permitted provided that the following
* c onditions are met:
*
* - Redistributions of sourc e c ode must retain the above
* c opyright notic e, this list of c onditions and the following
* disc laimer.
*
* - Redistributions in binary form must reproduc e the above
* c opyright notic e, this list of c onditions and the following
* disc laimer in the doc umentation and/or other materials
* provided with the distribution.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AWV
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
class="token mac ro property">class="token direc tive-hash"># class="token direc tive keyword">inc lude class="token string"><stdio.h>
class="token mac ro property">class="token direc tive-hash"># class="token direc tive keyword">inc lude class="token string"><stdlib.h>
class="token mac ro property">class="token direc tive-hash"># class="token direc tive keyword">inc lude class="token string"><string.h>
class="token mac ro property">class="token direc tive-hash"># class="token direc tive keyword">inc lude class="token string"><errno.h>
class="token mac ro property">class="token direc tive-hash"># class="token direc tive keyword">inc lude class="token string"><getopt.h>
class="token mac ro property">class="token direc tive-hash"># class="token direc tive keyword">inc lude class="token string"><netdb.h>
class="token mac ro property">class="token direc tive-hash"># class="token direc tive keyword">inc lude class="token string"><rdma/rdma_c ma.h>
class="token mac ro property">class="token direc tive-hash"># class="token direc tive keyword">inc lude class="token string"><rdma/rdma_verbs.h>
class="token keyword">static class="token keyword">c onst class="token keyword">c har class="token operator">* server class="token operator">= class="token string">"0.0.0.0" class="token punc tuation">;
class="token keyword">static class="token keyword">c onst class="token keyword">c har class="token operator">* port class="token operator">= class="token string">"7471" class="token punc tuation">;
class="token keyword">static class="token keyword">struc t class="token c lass-name">rdma_c m_id class="token operator">* listen_idclass="token punc tuation">, class="token operator">* idclass="token punc tuation">;
class="token keyword">static class="token keyword">struc t class="token c lass-name">ibv_mr class="token operator">* mrclass="token punc tuation">, class="token operator">* send_mrclass="token punc tuation">;
class="token keyword">static class="token keyword">int send_flagsclass="token punc tuation">;
class="token keyword">static class="token c lass-name">uint8_t send_msgclass="token punc tuation">[ class="token number">16 class="token punc tuation">] class="token punc tuation">;
class="token keyword">static class="token c lass-name">uint8_t rec v_msgclass="token punc tuation">[ class="token number">16 class="token punc tuation">] class="token punc tuation">;
class="token keyword">static class="token keyword">int class="token func tion">run class="token punc tuation">( class="token keyword">void class="token punc tuation">)
class="token punc tuation">{
class="token keyword">struc t class="token c lass-name">rdma_addrinfo hintsclass="token punc tuation">, class="token operator">* resclass="token punc tuation">;
class="token keyword">struc t class="token c lass-name">ibv_qp_init_attr init_attrclass="token punc tuation">;
class="token keyword">struc t class="token c lass-name">ibv_qp_attr qp_attrclass="token punc tuation">;
class="token keyword">struc t class="token c lass-name">ibv_wc wc class="token punc tuation">;
class="token keyword">int retclass="token punc tuation">;
class="token func tion">memset class="token punc tuation">( class="token operator">& hintsclass="token punc tuation">, class="token number">0 class="token punc tuation">, class="token keyword">sizeof hintsclass="token punc tuation">) class="token punc tuation">;
hintsclass="token punc tuation">. ai_flags class="token operator">= RAI_PASSIVEclass="token punc tuation">;
hintsclass="token punc tuation">. ai_port_spac e class="token operator">= c lass="tags" href="/tags/RDMA.html" title=RDMA>RDMA_PS_TCPclass="token punc tuation">;
ret class="token operator">= class="token func tion">rdma_getaddrinfo class="token punc tuation">( serverclass="token punc tuation">, portclass="token punc tuation">, class="token operator">& hintsclass="token punc tuation">, class="token operator">& resclass="token punc tuation">) class="token punc tuation">;
class="token keyword">if class="token punc tuation">( retclass="token punc tuation">) class="token punc tuation">{
class="token func tion">printf class="token punc tuation">( class="token string">"rdma_getaddrinfo: %s\n" class="token punc tuation">, class="token func tion">gai_strerror class="token punc tuation">( retclass="token punc tuation">) class="token punc tuation">) class="token punc tuation">;
class="token keyword">return retclass="token punc tuation">;
class="token punc tuation">}
class="token func tion">memset class="token punc tuation">( class="token operator">& init_attrclass="token punc tuation">, class="token number">0 class="token punc tuation">, class="token keyword">sizeof init_attrclass="token punc tuation">) class="token punc tuation">;
init_attrclass="token punc tuation">. c apclass="token punc tuation">. max_send_wr class="token operator">= init_attrclass="token punc tuation">. c apclass="token punc tuation">. max_rec v_wr class="token operator">= class="token number">1 class="token punc tuation">;
init_attrclass="token punc tuation">. c apclass="token punc tuation">. max_send_sge class="token operator">= init_attrclass="token punc tuation">. c apclass="token punc tuation">. max_rec v_sge class="token operator">= class="token number">1 class="token punc tuation">;
init_attrclass="token punc tuation">. c apclass="token punc tuation">. max_inline_data class="token operator">= class="token number">16 class="token punc tuation">;
init_attrclass="token punc tuation">. sq_sig_all class="token operator">= class="token number">1 class="token punc tuation">;
ret class="token operator">= class="token func tion">rdma_c reate_ep class="token punc tuation">( class="token operator">& listen_idclass="token punc tuation">, resclass="token punc tuation">, class="token c onstant">NULL class="token punc tuation">, class="token operator">& init_attrclass="token punc tuation">) class="token punc tuation">;
class="token keyword">if class="token punc tuation">( retclass="token punc tuation">) class="token punc tuation">{
class="token func tion">perror class="token punc tuation">( class="token string">"rdma_c reate_ep" class="token punc tuation">) class="token punc tuation">;
class="token keyword">goto out_free_addrinfoclass="token punc tuation">;
class="token punc tuation">}
ret class="token operator">= class="token func tion">rdma_listen class="token punc tuation">( listen_idclass="token punc tuation">, class="token number">0 class="token punc tuation">) class="token punc tuation">;
class="token keyword">if class="token punc tuation">( retclass="token punc tuation">) class="token punc tuation">{
class="token func tion">perror class="token punc tuation">( class="token string">"rdma_listen" class="token punc tuation">) class="token punc tuation">;
class="token keyword">goto out_destroy_listen_epclass="token punc tuation">;
class="token punc tuation">}
ret class="token operator">= class="token func tion">rdma_get_request class="token punc tuation">( listen_idclass="token punc tuation">, class="token operator">& idclass="token punc tuation">) class="token punc tuation">;
class="token keyword">if class="token punc tuation">( retclass="token punc tuation">) class="token punc tuation">{
class="token func tion">perror class="token punc tuation">( class="token string">"rdma_get_request" class="token punc tuation">) class="token punc tuation">;
class="token keyword">goto out_destroy_listen_epclass="token punc tuation">;
class="token punc tuation">}
class="token func tion">memset class="token punc tuation">( class="token operator">& qp_attrclass="token punc tuation">, class="token number">0 class="token punc tuation">, class="token keyword">sizeof qp_attrclass="token punc tuation">) class="token punc tuation">;
class="token func tion">memset class="token punc tuation">( class="token operator">& init_attrclass="token punc tuation">, class="token number">0 class="token punc tuation">, class="token keyword">sizeof init_attrclass="token punc tuation">) class="token punc tuation">;
ret class="token operator">= class="token func tion">ibv_query_qp class="token punc tuation">( idclass="token operator">-> qpclass="token punc tuation">, class="token operator">& qp_attrclass="token punc tuation">, IBV_QP_CAPclass="token punc tuation">,
class="token operator">& init_attrclass="token punc tuation">) class="token punc tuation">;
class="token keyword">if class="token punc tuation">( retclass="token punc tuation">) class="token punc tuation">{
class="token func tion">perror class="token punc tuation">( class="token string">"ibv_query_qp" class="token punc tuation">) class="token punc tuation">;
class="token keyword">goto out_destroy_ac c ept_epclass="token punc tuation">;
class="token punc tuation">}
class="token keyword">if class="token punc tuation">( init_attrclass="token punc tuation">. c apclass="token punc tuation">. max_inline_data class="token operator">>= class="token number">16 class="token punc tuation">)
send_flags class="token operator">= IBV_SEND_INLINEclass="token punc tuation">;
class="token keyword">else
class="token func tion">printf class="token punc tuation">( class="token string">"rdma_server: devic e doesn't support IBV_SEND_INLINE, "
class="token string">"using sge sends\n" class="token punc tuation">) class="token punc tuation">;
mr class="token operator">= class="token func tion">rdma_reg_msgs class="token punc tuation">( idclass="token punc tuation">, rec v_msgclass="token punc tuation">, class="token number">16 class="token punc tuation">) class="token punc tuation">;
class="token keyword">if class="token punc tuation">( class="token operator">! mrclass="token punc tuation">) class="token punc tuation">{
ret class="token operator">= class="token operator">- class="token number">1 class="token punc tuation">;
class="token func tion">perror class="token punc tuation">( class="token string">"rdma_reg_msgs for rec v_msg" class="token punc tuation">) class="token punc tuation">;
class="token keyword">goto out_destroy_ac c ept_epclass="token punc tuation">;
class="token punc tuation">}
class="token keyword">if class="token punc tuation">( class="token punc tuation">( send_flags class="token operator">& IBV_SEND_INLINEclass="token punc tuation">) class="token operator">== class="token number">0 class="token punc tuation">) class="token punc tuation">{
send_mr class="token operator">= class="token func tion">rdma_reg_msgs class="token punc tuation">( idclass="token punc tuation">, send_msgclass="token punc tuation">, class="token number">16 class="token punc tuation">) class="token punc tuation">;
class="token keyword">if class="token punc tuation">( class="token operator">! send_mrclass="token punc tuation">) class="token punc tuation">{
ret class="token operator">= class="token operator">- class="token number">1 class="token punc tuation">;
class="token func tion">perror class="token punc tuation">( class="token string">"rdma_reg_msgs for send_msg" class="token punc tuation">) class="token punc tuation">;
class="token keyword">goto out_dereg_rec vclass="token punc tuation">;
class="token punc tuation">}
class="token punc tuation">}
ret class="token operator">= class="token func tion">rdma_post_rec v class="token punc tuation">( idclass="token punc tuation">, class="token c onstant">NULL class="token punc tuation">, rec v_msgclass="token punc tuation">, class="token number">16 class="token punc tuation">, mrclass="token punc tuation">) class="token punc tuation">;
class="token keyword">if class="token punc tuation">( retclass="token punc tuation">) class="token punc tuation">{
class="token func tion">perror class="token punc tuation">( class="token string">"rdma_post_rec v" class="token punc tuation">) class="token punc tuation">;
class="token keyword">goto out_dereg_sendclass="token punc tuation">;
class="token punc tuation">}
ret class="token operator">= class="token func tion">rdma_ac c ept class="token punc tuation">( idclass="token punc tuation">, class="token c onstant">NULL class="token punc tuation">) class="token punc tuation">;
class="token keyword">if class="token punc tuation">( retclass="token punc tuation">) class="token punc tuation">{
class="token func tion">perror class="token punc tuation">( class="token string">"rdma_ac c ept" class="token punc tuation">) class="token punc tuation">;
class="token keyword">goto out_dereg_sendclass="token punc tuation">;
class="token punc tuation">}
class="token keyword">while class="token punc tuation">( class="token punc tuation">( ret class="token operator">= class="token func tion">rdma_get_rec v_c omp class="token punc tuation">( idclass="token punc tuation">, class="token operator">& wc class="token punc tuation">) class="token punc tuation">) class="token operator">== class="token number">0 class="token punc tuation">) class="token punc tuation">;
class="token keyword">if class="token punc tuation">( ret class="token operator">< class="token number">0 class="token punc tuation">) class="token punc tuation">{
class="token func tion">perror class="token punc tuation">( class="token string">"rdma_get_rec v_c omp" class="token punc tuation">) class="token punc tuation">;
class="token keyword">goto out_disc onnec tclass="token punc tuation">;
class="token punc tuation">}
class="token func tion">printf class="token punc tuation">( class="token string">"server rec eived: %s\n" class="token punc tuation">, class="token punc tuation">( class="token keyword">c har class="token operator">* class="token punc tuation">) rec v_msgclass="token punc tuation">) class="token punc tuation">;
class="token keyword">c har class="token operator">* s class="token operator">= class="token string">"ACK" class="token punc tuation">;
class="token func tion">memc py class="token punc tuation">( send_msgclass="token punc tuation">, sclass="token punc tuation">, class="token func tion">strlen class="token punc tuation">( sclass="token punc tuation">) class="token punc tuation">) class="token punc tuation">;
class="token func tion">printf class="token punc tuation">( class="token string">"server send: %s\n" class="token punc tuation">, class="token punc tuation">( class="token keyword">c har class="token operator">* class="token punc tuation">) send_msgclass="token punc tuation">) class="token punc tuation">;
ret class="token operator">= class="token func tion">rdma_post_send class="token punc tuation">( idclass="token punc tuation">, class="token c onstant">NULL class="token punc tuation">, send_msgclass="token punc tuation">, class="token number">16 class="token punc tuation">, send_mrclass="token punc tuation">, send_flagsclass="token punc tuation">) class="token punc tuation">;
class="token keyword">if class="token punc tuation">( retclass="token punc tuation">) class="token punc tuation">{
class="token func tion">perror class="token punc tuation">( class="token string">"rdma_post_send" class="token punc tuation">) class="token punc tuation">;
class="token keyword">goto out_disc onnec tclass="token punc tuation">;
class="token punc tuation">}
class="token keyword">while class="token punc tuation">( class="token punc tuation">( ret class="token operator">= class="token func tion">rdma_get_send_c omp class="token punc tuation">( idclass="token punc tuation">, class="token operator">& wc class="token punc tuation">) class="token punc tuation">) class="token operator">== class="token number">0 class="token punc tuation">) class="token punc tuation">;
class="token keyword">if class="token punc tuation">( ret class="token operator">< class="token number">0 class="token punc tuation">)
class="token func tion">perror class="token punc tuation">( class="token string">"rdma_get_send_c omp" class="token punc tuation">) class="token punc tuation">;
class="token keyword">else
ret class="token operator">= class="token number">0 class="token punc tuation">;
out_disc onnec tclass="token operator">:
class="token func tion">rdma_disc onnec t class="token punc tuation">( idclass="token punc tuation">) class="token punc tuation">;
out_dereg_sendclass="token operator">:
class="token keyword">if class="token punc tuation">( class="token punc tuation">( send_flags class="token operator">& IBV_SEND_INLINEclass="token punc tuation">) class="token operator">== class="token number">0 class="token punc tuation">)
class="token func tion">rdma_dereg_mr class="token punc tuation">( send_mrclass="token punc tuation">) class="token punc tuation">;
out_dereg_rec vclass="token operator">:
class="token func tion">rdma_dereg_mr class="token punc tuation">( mrclass="token punc tuation">) class="token punc tuation">;
out_destroy_ac c ept_epclass="token operator">:
class="token func tion">rdma_destroy_ep class="token punc tuation">( idclass="token punc tuation">) class="token punc tuation">;
out_destroy_listen_epclass="token operator">:
class="token func tion">rdma_destroy_ep class="token punc tuation">( listen_idclass="token punc tuation">) class="token punc tuation">;
out_free_addrinfoclass="token operator">:
class="token func tion">rdma_freeaddrinfo class="token punc tuation">( resclass="token punc tuation">) class="token punc tuation">;
class="token keyword">return retclass="token punc tuation">;
class="token punc tuation">}
class="token keyword">int class="token func tion">main class="token punc tuation">( class="token keyword">int argc class="token punc tuation">, class="token keyword">c har class="token operator">* class="token operator">* argvclass="token punc tuation">)
class="token punc tuation">{
class="token keyword">int retclass="token punc tuation">;
class="token func tion">printf class="token punc tuation">( class="token string">"rdma_server: start\n" class="token punc tuation">) class="token punc tuation">;
ret class="token operator">= class="token func tion">run class="token punc tuation">( class="token punc tuation">) class="token punc tuation">;
class="token func tion">printf class="token punc tuation">( class="token string">"rdma_server: end %d\n" class="token punc tuation">, retclass="token punc tuation">) class="token punc tuation">;
class="token keyword">return retclass="token punc tuation">;
class="token punc tuation">}
c ode>
首先make编译完之后c ;在server端执行 ./server1c ;然后在客户端执行./c lient1 运行结果: c="https://img-blog.c sdnimg.c n/direc t/7962bb5b288d479fab6e4b58485d2f39.png" alt="在这里插入图片描述" /> c="https://img-blog.c sdnimg.c n/direc t/8204114503724d9c 922516063b56e8c 3.png" alt="在这里插入图片描述" /> 可以看到 c lient向server发送了hello worldc ;server收到之后打印出来并回复给c lient端ACK消息c ;c lient收到之后并打印。最后双方断开连接c ;完成!
version2-客户端发送一次c ;服务端循环等待
c lient2的代码跟上面一样c ;server2代码不一样。 server2的逻辑:在run函数进来之后记录一个c onnec t点c ;当远程客户端发送完信息后c ;释放连接的资源c ;跳转到c onnec t阶段准备让下一个c lient连接。
<c ode c lass="prism language-c ">class="token c omment">/*
* Copyright (c ) 2005-2009 Intel Corporation. All rights reserved.
*
* This software is available to you under the OpenIB.org BSD lic ense
* below:
*
* Redistribution and use in sourc e and binary forms, with or
* without modific ation, are permitted provided that the following
* c onditions are met:
*
* - Redistributions of sourc e c ode must retain the above
* c opyright notic e, this list of c onditions and the following
* disc laimer.
*
* - Redistributions in binary form must reproduc e the above
* c opyright notic e, this list of c onditions and the following
* disc laimer in the doc umentation and/or other materials
* provided with the distribution.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AWV
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
class="token mac ro property">class="token direc tive-hash"># class="token direc tive keyword">inc lude class="token string"><stdio.h>
class="token mac ro property">class="token direc tive-hash"># class="token direc tive keyword">inc lude class="token string"><stdlib.h>
class="token mac ro property">class="token direc tive-hash"># class="token direc tive keyword">inc lude class="token string"><string.h>
class="token mac ro property">class="token direc tive-hash"># class="token direc tive keyword">inc lude class="token string"><errno.h>
class="token mac ro property">class="token direc tive-hash"># class="token direc tive keyword">inc lude class="token string"><getopt.h>
class="token mac ro property">class="token direc tive-hash"># class="token direc tive keyword">inc lude class="token string"><netdb.h>
class="token mac ro property">class="token direc tive-hash"># class="token direc tive keyword">inc lude class="token string"><rdma/rdma_c ma.h>
class="token mac ro property">class="token direc tive-hash"># class="token direc tive keyword">inc lude class="token string"><rdma/rdma_verbs.h>
class="token mac ro property">class="token direc tive-hash"># class="token direc tive keyword">define class="token mac ro-name">N class="token expression">class="token number">100
class="token mac ro property">class="token direc tive-hash"># class="token direc tive keyword">define class="token mac ro-name">MAX_CAP class="token expression">class="token number">32
class="token keyword">static class="token keyword">c onst class="token keyword">c har class="token operator">* server class="token operator">= class="token string">"0.0.0.0" class="token punc tuation">;
class="token keyword">static class="token keyword">c onst class="token keyword">c har class="token operator">* port class="token operator">= class="token string">"7471" class="token punc tuation">;
class="token keyword">static class="token keyword">struc t class="token c lass-name">rdma_c m_id class="token operator">* listen_idclass="token punc tuation">, class="token operator">* idclass="token punc tuation">;
class="token keyword">static class="token keyword">struc t class="token c lass-name">ibv_mr class="token operator">* mrclass="token punc tuation">, class="token operator">* send_mrclass="token punc tuation">;
class="token keyword">static class="token keyword">int send_flagsclass="token punc tuation">;
class="token keyword">static class="token c lass-name">uint8_t send_msgclass="token punc tuation">[ MAX_CAPclass="token punc tuation">] class="token punc tuation">;
class="token keyword">static class="token c lass-name">uint8_t rec v_msgclass="token punc tuation">[ MAX_CAPclass="token punc tuation">] class="token punc tuation">;
class="token keyword">static class="token keyword">int class="token func tion">run class="token punc tuation">( class="token keyword">void class="token punc tuation">)
class="token punc tuation">{
class="token keyword">struc t class="token c lass-name">rdma_addrinfo hintsclass="token punc tuation">, class="token operator">* resclass="token punc tuation">;
class="token keyword">struc t class="token c lass-name">ibv_qp_init_attr init_attrclass="token punc tuation">;
class="token keyword">struc t class="token c lass-name">ibv_qp_attr qp_attrclass="token punc tuation">;
class="token keyword">struc t class="token c lass-name">ibv_wc wc class="token punc tuation">;
class="token keyword">int retclass="token punc tuation">;
class="token keyword">while class="token punc tuation">( class="token number">1 class="token punc tuation">)
class="token punc tuation">{
class="token func tion">memset class="token punc tuation">( class="token operator">& hintsclass="token punc tuation">, class="token number">0 class="token punc tuation">, class="token keyword">sizeof hintsclass="token punc tuation">) class="token punc tuation">;
hintsclass="token punc tuation">. ai_flags class="token operator">= RAI_PASSIVEclass="token punc tuation">;
hintsclass="token punc tuation">. ai_port_spac e class="token operator">= c lass="tags" href="/tags/RDMA.html" title=RDMA>RDMA_PS_TCPclass="token punc tuation">;
ret class="token operator">= class="token func tion">rdma_getaddrinfo class="token punc tuation">( serverclass="token punc tuation">, portclass="token punc tuation">, class="token operator">& hintsclass="token punc tuation">, class="token operator">& resclass="token punc tuation">) class="token punc tuation">;
class="token keyword">if class="token punc tuation">( retclass="token punc tuation">) class="token punc tuation">{
class="token func tion">printf class="token punc tuation">( class="token string">"rdma_getaddrinfo: %s\n" class="token punc tuation">, class="token func tion">gai_strerror class="token punc tuation">( retclass="token punc tuation">) class="token punc tuation">) class="token punc tuation">;
class="token keyword">return retclass="token punc tuation">;
class="token punc tuation">}
class="token func tion">memset class="token punc tuation">( class="token operator">& init_attrclass="token punc tuation">, class="token number">0 class="token punc tuation">, class="token keyword">sizeof init_attrclass="token punc tuation">) class="token punc tuation">;
init_attrclass="token punc tuation">. c apclass="token punc tuation">. max_send_wr class="token operator">= init_attrclass="token punc tuation">. c apclass="token punc tuation">. max_rec v_wr class="token operator">= Nclass="token punc tuation">;
init_attrclass="token punc tuation">. c apclass="token punc tuation">. max_send_sge class="token operator">= init_attrclass="token punc tuation">. c apclass="token punc tuation">. max_rec v_sge class="token operator">= class="token number">1 class="token punc tuation">;
init_attrclass="token punc tuation">. c apclass="token punc tuation">. max_inline_data class="token operator">= MAX_CAPclass="token punc tuation">;
init_attrclass="token punc tuation">. sq_sig_all class="token operator">= class="token number">1 class="token punc tuation">;
ret class="token operator">= class="token func tion">rdma_c reate_ep class="token punc tuation">( class="token operator">& listen_idclass="token punc tuation">, resclass="token punc tuation">, class="token c onstant">NULL class="token punc tuation">, class="token operator">& init_attrclass="token punc tuation">) class="token punc tuation">;
class="token keyword">if class="token punc tuation">( retclass="token punc tuation">) class="token punc tuation">{
class="token func tion">perror class="token punc tuation">( class="token string">"rdma_c reate_ep" class="token punc tuation">) class="token punc tuation">;
class="token keyword">goto out_free_addrinfoclass="token punc tuation">;
class="token punc tuation">}
ret class="token operator">= class="token func tion">rdma_listen class="token punc tuation">( listen_idclass="token punc tuation">, class="token number">0 class="token punc tuation">) class="token punc tuation">;
class="token keyword">if class="token punc tuation">( retclass="token punc tuation">) class="token punc tuation">{
class="token func tion">perror class="token punc tuation">( class="token string">"rdma_listen" class="token punc tuation">) class="token punc tuation">;
class="token keyword">goto out_destroy_listen_epclass="token punc tuation">;
class="token punc tuation">}
ret class="token operator">= class="token func tion">rdma_get_request class="token punc tuation">( listen_idclass="token punc tuation">, class="token operator">& idclass="token punc tuation">) class="token punc tuation">;
class="token keyword">if class="token punc tuation">( retclass="token punc tuation">) class="token punc tuation">{
class="token func tion">perror class="token punc tuation">( class="token string">"rdma_get_request" class="token punc tuation">) class="token punc tuation">;
class="token keyword">goto out_destroy_listen_epclass="token punc tuation">;
class="token punc tuation">}
class="token func tion">memset class="token punc tuation">( class="token operator">& qp_attrclass="token punc tuation">, class="token number">0 class="token punc tuation">, class="token keyword">sizeof qp_attrclass="token punc tuation">) class="token punc tuation">;
class="token func tion">memset class="token punc tuation">( class="token operator">& init_attrclass="token punc tuation">, class="token number">0 class="token punc tuation">, class="token keyword">sizeof init_attrclass="token punc tuation">) class="token punc tuation">;
ret class="token operator">= class="token func tion">ibv_query_qp class="token punc tuation">( idclass="token operator">-> qpclass="token punc tuation">, class="token operator">& qp_attrclass="token punc tuation">, IBV_QP_CAPclass="token punc tuation">,
class="token operator">& init_attrclass="token punc tuation">) class="token punc tuation">;
class="token keyword">if class="token punc tuation">( retclass="token punc tuation">) class="token punc tuation">{
class="token func tion">perror class="token punc tuation">( class="token string">"ibv_query_qp" class="token punc tuation">) class="token punc tuation">;
class="token keyword">goto out_destroy_ac c ept_epclass="token punc tuation">;
class="token punc tuation">}
class="token keyword">if class="token punc tuation">( init_attrclass="token punc tuation">. c apclass="token punc tuation">. max_inline_data class="token operator">>= MAX_CAPclass="token punc tuation">)
send_flags class="token operator">= IBV_SEND_INLINEclass="token punc tuation">;
class="token keyword">else
class="token func tion">printf class="token punc tuation">( class="token string">"rdma_server: devic e doesn't support IBV_SEND_INLINE, "
class="token string">"using sge sends\n" class="token punc tuation">) class="token punc tuation">;
mr class="token operator">= class="token func tion">rdma_reg_msgs class="token punc tuation">( idclass="token punc tuation">, rec v_msgclass="token punc tuation">, Nclass="token punc tuation">) class="token punc tuation">;
class="token keyword">if class="token punc tuation">( class="token operator">! mrclass="token punc tuation">) class="token punc tuation">{
ret class="token operator">= class="token operator">- class="token number">1 class="token punc tuation">;
class="token func tion">perror class="token punc tuation">( class="token string">"rdma_reg_msgs for rec v_msg" class="token punc tuation">) class="token punc tuation">;
class="token keyword">goto out_destroy_ac c ept_epclass="token punc tuation">;
class="token punc tuation">}
class="token keyword">if class="token punc tuation">( class="token punc tuation">( send_flags class="token operator">& IBV_SEND_INLINEclass="token punc tuation">) class="token operator">== class="token number">0 class="token punc tuation">) class="token punc tuation">{
send_mr class="token operator">= class="token func tion">rdma_reg_msgs class="token punc tuation">( idclass="token punc tuation">, send_msgclass="token punc tuation">, MAX_CAPclass="token punc tuation">) class="token punc tuation">;
class="token keyword">if class="token punc tuation">( class="token operator">! send_mrclass="token punc tuation">) class="token punc tuation">{
ret class="token operator">= class="token operator">- class="token number">1 class="token punc tuation">;
class="token func tion">perror class="token punc tuation">( class="token string">"rdma_reg_msgs for send_msg" class="token punc tuation">) class="token punc tuation">;
class="token keyword">goto out_dereg_rec vclass="token punc tuation">;
class="token punc tuation">}
class="token punc tuation">}
ret class="token operator">= class="token func tion">rdma_ac c ept class="token punc tuation">( idclass="token punc tuation">, class="token c onstant">NULL class="token punc tuation">) class="token punc tuation">;
class="token keyword">if class="token punc tuation">( retclass="token punc tuation">) class="token punc tuation">{
class="token func tion">perror class="token punc tuation">( class="token string">"rdma_ac c ept" class="token punc tuation">) class="token punc tuation">;
class="token keyword">goto out_dereg_sendclass="token punc tuation">;
class="token punc tuation">}
class="token func tion">memset class="token punc tuation">( rec v_msgclass="token punc tuation">, class="token number">0 class="token punc tuation">, class="token keyword">sizeof rec v_msgclass="token punc tuation">) class="token punc tuation">;
class="token func tion">memset class="token punc tuation">( send_msgclass="token punc tuation">, class="token number">0 class="token punc tuation">, class="token keyword">sizeof send_msgclass="token punc tuation">) class="token punc tuation">;
ret class="token operator">= class="token func tion">rdma_post_rec v class="token punc tuation">( idclass="token punc tuation">, class="token c onstant">NULL class="token punc tuation">, rec v_msgclass="token punc tuation">, MAX_CAPclass="token punc tuation">, mrclass="token punc tuation">) class="token punc tuation">;
class="token keyword">if class="token punc tuation">( retclass="token punc tuation">) class="token punc tuation">{
class="token func tion">perror class="token punc tuation">( class="token string">"rdma_post_rec v" class="token punc tuation">) class="token punc tuation">;
class="token keyword">goto out_dereg_sendclass="token punc tuation">;
class="token punc tuation">}
class="token keyword">while class="token punc tuation">( class="token punc tuation">( ret class="token operator">= class="token func tion">rdma_get_rec v_c omp class="token punc tuation">( idclass="token punc tuation">, class="token operator">& wc class="token punc tuation">) class="token punc tuation">) class="token operator">== class="token number">0 class="token punc tuation">) class="token punc tuation">;
class="token keyword">if class="token punc tuation">( ret class="token operator">< class="token number">0 class="token punc tuation">) class="token punc tuation">{
class="token func tion">perror class="token punc tuation">( class="token string">"rdma_get_rec v_c omp" class="token punc tuation">) class="token punc tuation">;
class="token keyword">goto out_disc onnec tclass="token punc tuation">;
class="token punc tuation">}
class="token func tion">printf class="token punc tuation">( class="token string">"server rec eived: %s\n" class="token punc tuation">, class="token punc tuation">( class="token keyword">c har class="token operator">* class="token punc tuation">) rec v_msgclass="token punc tuation">) class="token punc tuation">;
class="token func tion">memc py class="token punc tuation">( send_msgclass="token punc tuation">, rec v_msgclass="token punc tuation">, class="token keyword">sizeof class="token punc tuation">( rec v_msgclass="token punc tuation">) class="token punc tuation">) class="token punc tuation">;
ret class="token operator">= class="token func tion">rdma_post_send class="token punc tuation">( idclass="token punc tuation">, class="token c onstant">NULL class="token punc tuation">, send_msgclass="token punc tuation">, MAX_CAPclass="token punc tuation">, send_mrclass="token punc tuation">, send_flagsclass="token punc tuation">) class="token punc tuation">;
class="token keyword">if class="token punc tuation">( retclass="token punc tuation">) class="token punc tuation">{
class="token func tion">perror class="token punc tuation">( class="token string">"rdma_post_send" class="token punc tuation">) class="token punc tuation">;
class="token keyword">goto out_disc onnec tclass="token punc tuation">;
class="token punc tuation">}
class="token keyword">while class="token punc tuation">( class="token punc tuation">( ret class="token operator">= class="token func tion">rdma_get_send_c omp class="token punc tuation">( idclass="token punc tuation">, class="token operator">& wc class="token punc tuation">) class="token punc tuation">) class="token operator">== class="token number">0 class="token punc tuation">) class="token punc tuation">; class="token c omment">// 确认对方已经收到 对方会发送ac k
class="token keyword">if class="token punc tuation">( ret class="token operator">< class="token number">0 class="token punc tuation">)
class="token func tion">perror class="token punc tuation">( class="token string">"rdma_get_send_c omp" class="token punc tuation">) class="token punc tuation">;
class="token keyword">else
ret class="token operator">= class="token number">0 class="token punc tuation">;
class="token func tion">rdma_disc onnec t class="token punc tuation">( idclass="token punc tuation">) class="token punc tuation">;
class="token keyword">if class="token punc tuation">( class="token punc tuation">( send_flags class="token operator">& IBV_SEND_INLINEclass="token punc tuation">) class="token operator">== class="token number">0 class="token punc tuation">)
class="token func tion">rdma_dereg_mr class="token punc tuation">( send_mrclass="token punc tuation">) class="token punc tuation">;
class="token func tion">rdma_dereg_mr class="token punc tuation">( mrclass="token punc tuation">) class="token punc tuation">;
class="token func tion">rdma_destroy_ep class="token punc tuation">( idclass="token punc tuation">) class="token punc tuation">;
class="token func tion">rdma_destroy_ep class="token punc tuation">( listen_idclass="token punc tuation">) class="token punc tuation">;
class="token func tion">rdma_freeaddrinfo class="token punc tuation">( resclass="token punc tuation">) class="token punc tuation">;
class="token punc tuation">}
out_disc onnec tclass="token operator">:
class="token func tion">rdma_disc onnec t class="token punc tuation">( idclass="token punc tuation">) class="token punc tuation">;
out_dereg_sendclass="token operator">:
class="token keyword">if class="token punc tuation">( class="token punc tuation">( send_flags class="token operator">& IBV_SEND_INLINEclass="token punc tuation">) class="token operator">== class="token number">0 class="token punc tuation">)
class="token func tion">rdma_dereg_mr class="token punc tuation">( send_mrclass="token punc tuation">) class="token punc tuation">;
out_dereg_rec vclass="token operator">:
class="token func tion">rdma_dereg_mr class="token punc tuation">( mrclass="token punc tuation">) class="token punc tuation">;
out_destroy_ac c ept_epclass="token operator">:
class="token func tion">rdma_destroy_ep class="token punc tuation">( idclass="token punc tuation">) class="token punc tuation">;
out_destroy_listen_epclass="token operator">:
class="token func tion">rdma_destroy_ep class="token punc tuation">( listen_idclass="token punc tuation">) class="token punc tuation">;
out_free_addrinfoclass="token operator">:
class="token func tion">rdma_freeaddrinfo class="token punc tuation">( resclass="token punc tuation">) class="token punc tuation">;
class="token keyword">return retclass="token punc tuation">;
class="token punc tuation">}
class="token keyword">int class="token func tion">main class="token punc tuation">( class="token keyword">int argc class="token punc tuation">, class="token keyword">c har class="token operator">* class="token operator">* argvclass="token punc tuation">)
class="token punc tuation">{
class="token keyword">int retclass="token punc tuation">;
class="token func tion">printf class="token punc tuation">( class="token string">"rdma_server: start\n" class="token punc tuation">) class="token punc tuation">;
ret class="token operator">= class="token func tion">run class="token punc tuation">( class="token punc tuation">) class="token punc tuation">;
class="token func tion">printf class="token punc tuation">( class="token string">"rdma_server: end %d\n" class="token punc tuation">, retclass="token punc tuation">) class="token punc tuation">;
class="token keyword">return retclass="token punc tuation">;
class="token punc tuation">}
c ode>
运行结果: c="https://img-blog.c sdnimg.c n/direc t/e7fe229278d043e3a82281c 137b19da3.png" alt="在这里插入图片描述" />
c="https://img-blog.c sdnimg.c n/direc t/b5c b719b742b4fdbb08fc ad65b7c b01c .png" alt="在这里插入图片描述" />
可以看到客户端发送一次消息之后便结束了c ;服务端却一直等待连接c ;直到按下c trl+c 。
version3-客户端循环发送c ;服务端循环等待c ;一次连接
和上述版本2不同的时候c ;这里c lient和server只连接一次c ;然后可以多次发送消息。直到c lient发送的消息为disc onnec t
<c ode c lass="prism language-c ">class="token c omment">// c lient3.c
class="token c omment">/*
* Copyright (c ) 2010 Intel Corporation. All rights reserved.
*
* This software is available to you under the OpenIB.org BSD lic ense
* below:
*
* Redistribution and use in sourc e and binary forms, with or
* without modific ation, are permitted provided that the following
* c onditions are met:
*
* - Redistributions of sourc e c ode must retain the above
* c opyright notic e, this list of c onditions and the following
* disc laimer.
*
* - Redistributions in binary form must reproduc e the above
* c opyright notic e, this list of c onditions and the following
* disc laimer in the doc umentation and/or other materials
* provided with the distribution.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AWV
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
class="token mac ro property">class="token direc tive-hash"># class="token direc tive keyword">inc lude class="token string"><stdio.h>
class="token mac ro property">class="token direc tive-hash"># class="token direc tive keyword">inc lude class="token string"><stdlib.h>
class="token mac ro property">class="token direc tive-hash"># class="token direc tive keyword">inc lude class="token string"><string.h>
class="token mac ro property">class="token direc tive-hash"># class="token direc tive keyword">inc lude class="token string"><netdb.h>
class="token mac ro property">class="token direc tive-hash"># class="token direc tive keyword">inc lude class="token string"><errno.h>
class="token mac ro property">class="token direc tive-hash"># class="token direc tive keyword">inc lude class="token string"><getopt.h>
class="token mac ro property">class="token direc tive-hash"># class="token direc tive keyword">inc lude class="token string"><rdma/rdma_c ma.h>
class="token mac ro property">class="token direc tive-hash"># class="token direc tive keyword">inc lude class="token string"><rdma/rdma_verbs.h>
class="token mac ro property">class="token direc tive-hash"># class="token direc tive keyword">define class="token mac ro-name">N class="token expression">class="token number">100
class="token mac ro property">class="token direc tive-hash"># class="token direc tive keyword">define class="token mac ro-name">MAX_CAP class="token expression">class="token number">32
class="token keyword">static class="token keyword">c onst class="token keyword">c har class="token operator">* server class="token operator">= class="token string">"10.10.10.1" class="token punc tuation">;
class="token keyword">static class="token keyword">c onst class="token keyword">c har class="token operator">* port class="token operator">= class="token string">"7471" class="token punc tuation">;
class="token keyword">static class="token keyword">struc t class="token c lass-name">rdma_c m_id class="token operator">* idclass="token punc tuation">;
class="token keyword">static class="token keyword">struc t class="token c lass-name">ibv_mr class="token operator">* mrclass="token punc tuation">, class="token operator">* send_mrclass="token punc tuation">;
class="token keyword">static class="token keyword">int send_flagsclass="token punc tuation">;
class="token keyword">static class="token c lass-name">uint8_t send_msgclass="token punc tuation">[ MAX_CAPclass="token punc tuation">] class="token punc tuation">;
class="token keyword">static class="token c lass-name">uint8_t rec v_msgclass="token punc tuation">[ MAX_CAPclass="token punc tuation">] class="token punc tuation">;
class="token keyword">static class="token keyword">int class="token func tion">run class="token punc tuation">( class="token keyword">void class="token punc tuation">)
class="token punc tuation">{
class="token keyword">struc t class="token c lass-name">rdma_addrinfo hintsclass="token punc tuation">, class="token operator">* resclass="token punc tuation">;
class="token keyword">struc t class="token c lass-name">ibv_qp_init_attr attrclass="token punc tuation">;
class="token keyword">struc t class="token c lass-name">ibv_wc wc class="token punc tuation">;
class="token keyword">int retclass="token punc tuation">;
class="token func tion">memset class="token punc tuation">( class="token operator">& hintsclass="token punc tuation">, class="token number">0 class="token punc tuation">, class="token keyword">sizeof hintsclass="token punc tuation">) class="token punc tuation">;
hintsclass="token punc tuation">. ai_port_spac e class="token operator">= c lass="tags" href="/tags/RDMA.html" title=RDMA>RDMA_PS_TCPclass="token punc tuation">;
ret class="token operator">= class="token func tion">rdma_getaddrinfo class="token punc tuation">( serverclass="token punc tuation">, portclass="token punc tuation">, class="token operator">& hintsclass="token punc tuation">, class="token operator">& resclass="token punc tuation">) class="token punc tuation">;
class="token keyword">if class="token punc tuation">( retclass="token punc tuation">) class="token punc tuation">{
class="token func tion">printf class="token punc tuation">( class="token string">"rdma_getaddrinfo: %s\n" class="token punc tuation">, class="token func tion">gai_strerror class="token punc tuation">( retclass="token punc tuation">) class="token punc tuation">) class="token punc tuation">;
class="token keyword">goto outclass="token punc tuation">;
class="token punc tuation">}
class="token func tion">memset class="token punc tuation">( class="token operator">& attrclass="token punc tuation">, class="token number">0 class="token punc tuation">, class="token keyword">sizeof attrclass="token punc tuation">) class="token punc tuation">;
attrclass="token punc tuation">. c apclass="token punc tuation">. max_send_wr class="token operator">= attrclass="token punc tuation">. c apclass="token punc tuation">. max_rec v_wr class="token operator">= class="token number">5 class="token punc tuation">;
attrclass="token punc tuation">. c apclass="token punc tuation">. max_send_sge class="token operator">= attrclass="token punc tuation">. c apclass="token punc tuation">. max_rec v_sge class="token operator">= class="token number">1 class="token punc tuation">;
attrclass="token punc tuation">. c apclass="token punc tuation">. max_inline_data class="token operator">= MAX_CAPclass="token punc tuation">;
attrclass="token punc tuation">. qp_c ontext class="token operator">= idclass="token punc tuation">;
attrclass="token punc tuation">. sq_sig_all class="token operator">= class="token number">1 class="token punc tuation">;
ret class="token operator">= class="token func tion">rdma_c reate_ep class="token punc tuation">( class="token operator">& idclass="token punc tuation">, resclass="token punc tuation">, class="token c onstant">NULL class="token punc tuation">, class="token operator">& attrclass="token punc tuation">) class="token punc tuation">;
class="token c omment">// Chec k to see if we got inline data allowed or not
class="token keyword">if class="token punc tuation">( attrclass="token punc tuation">. c apclass="token punc tuation">. max_inline_data class="token operator">>= MAX_CAPclass="token punc tuation">)
send_flags class="token operator">= IBV_SEND_INLINEclass="token punc tuation">;
class="token keyword">else
class="token func tion">printf class="token punc tuation">( class="token string">"rdma_c lient: devic e doesn't support IBV_SEND_INLINE, "
class="token string">"using sge sends\n" class="token punc tuation">) class="token punc tuation">;
class="token keyword">if class="token punc tuation">( retclass="token punc tuation">) class="token punc tuation">{
class="token func tion">perror class="token punc tuation">( class="token string">"rdma_c reate_ep" class="token punc tuation">) class="token punc tuation">;
class="token keyword">goto out_free_addrinfoclass="token punc tuation">;
class="token punc tuation">}
mr class="token operator">= class="token func tion">rdma_reg_msgs class="token punc tuation">( idclass="token punc tuation">, rec v_msgclass="token punc tuation">, MAX_CAPclass="token punc tuation">) class="token punc tuation">;
class="token keyword">if class="token punc tuation">( class="token operator">! mrclass="token punc tuation">) class="token punc tuation">{
class="token func tion">perror class="token punc tuation">( class="token string">"rdma_reg_msgs for rec v_msg" class="token punc tuation">) class="token punc tuation">;
ret class="token operator">= class="token operator">- class="token number">1 class="token punc tuation">;
class="token keyword">goto out_destroy_epclass="token punc tuation">;
class="token punc tuation">}
class="token keyword">if class="token punc tuation">( class="token punc tuation">( send_flags class="token operator">& IBV_SEND_INLINEclass="token punc tuation">) class="token operator">== class="token number">0 class="token punc tuation">) class="token punc tuation">{
send_mr class="token operator">= class="token func tion">rdma_reg_msgs class="token punc tuation">( idclass="token punc tuation">, send_msgclass="token punc tuation">, MAX_CAPclass="token punc tuation">) class="token punc tuation">;
class="token keyword">if class="token punc tuation">( class="token operator">! send_mrclass="token punc tuation">) class="token punc tuation">{
class="token func tion">perror class="token punc tuation">( class="token string">"rdma_reg_msgs for send_msg" class="token punc tuation">) class="token punc tuation">;
ret class="token operator">= class="token operator">- class="token number">1 class="token punc tuation">;
class="token keyword">goto out_dereg_rec vclass="token punc tuation">;
class="token punc tuation">}
class="token punc tuation">}
class="token c omment">// ret = rdma_post_rec v(id, NULL, rec v_msg, 16, mr);
class="token c omment">// if (ret) {
class="token c omment">// perror("rdma_post_rec v");
class="token c omment">// goto out_dereg_send;
class="token c omment">// }
class="token c omment">// printf("123\n");
ret class="token operator">= class="token func tion">rdma_c onnec t class="token punc tuation">( idclass="token punc tuation">, class="token c onstant">NULL class="token punc tuation">) class="token punc tuation">;
class="token keyword">if class="token punc tuation">( retclass="token punc tuation">) class="token punc tuation">{
class="token func tion">perror class="token punc tuation">( class="token string">"rdma_c onnec t" class="token punc tuation">) class="token punc tuation">;
class="token keyword">goto out_dereg_sendclass="token punc tuation">;
class="token punc tuation">}
class="token keyword">while class="token punc tuation">( class="token number">1 class="token punc tuation">)
class="token punc tuation">{
class="token c omment">// sleep(5);
class="token func tion">memset class="token punc tuation">( rec v_msgclass="token punc tuation">, class="token number">0 class="token punc tuation">, class="token keyword">sizeof rec v_msgclass="token punc tuation">) class="token punc tuation">;
class="token func tion">memset class="token punc tuation">( send_msgclass="token punc tuation">, class="token number">0 class="token punc tuation">, class="token keyword">sizeof send_msgclass="token punc tuation">) class="token punc tuation">;
class="token func tion">printf class="token punc tuation">( class="token string">"input send message: " class="token punc tuation">) class="token punc tuation">;
class="token func tion">sc anf class="token punc tuation">( class="token string">"%s" class="token punc tuation">, send_msgclass="token punc tuation">) class="token punc tuation">;
class="token func tion">getc har class="token punc tuation">( class="token punc tuation">) class="token punc tuation">;
ret class="token operator">= class="token func tion">rdma_post_rec v class="token punc tuation">( idclass="token punc tuation">, class="token c onstant">NULL class="token punc tuation">, rec v_msgclass="token punc tuation">, MAX_CAPclass="token punc tuation">, mrclass="token punc tuation">) class="token punc tuation">;
class="token keyword">if class="token punc tuation">( retclass="token punc tuation">) class="token punc tuation">{
class="token func tion">perror class="token punc tuation">( class="token string">"rdma_post_rec v" class="token punc tuation">) class="token punc tuation">;
class="token keyword">goto out_dereg_sendclass="token punc tuation">;
class="token punc tuation">}
ret class="token operator">= class="token func tion">rdma_post_send class="token punc tuation">( idclass="token punc tuation">, class="token c onstant">NULL class="token punc tuation">, send_msgclass="token punc tuation">, MAX_CAPclass="token punc tuation">, send_mrclass="token punc tuation">, send_flagsclass="token punc tuation">) class="token punc tuation">;
class="token keyword">if class="token punc tuation">( retclass="token punc tuation">) class="token punc tuation">{
class="token func tion">perror class="token punc tuation">( class="token string">"rdma_post_send" class="token punc tuation">) class="token punc tuation">;
class="token keyword">goto out_disc onnec tclass="token punc tuation">;
class="token punc tuation">}
class="token keyword">while class="token punc tuation">( class="token punc tuation">( ret class="token operator">= class="token func tion">rdma_get_send_c omp class="token punc tuation">( idclass="token punc tuation">, class="token operator">& wc class="token punc tuation">) class="token punc tuation">) class="token operator">== class="token number">0 class="token punc tuation">) class="token punc tuation">;
class="token keyword">if class="token punc tuation">( ret class="token operator">< class="token number">0 class="token punc tuation">) class="token punc tuation">{
class="token func tion">perror class="token punc tuation">( class="token string">"rdma_get_send_c omp" class="token punc tuation">) class="token punc tuation">;
class="token keyword">goto out_disc onnec tclass="token punc tuation">;
class="token punc tuation">}
class="token keyword">while class="token punc tuation">( class="token punc tuation">( ret class="token operator">= class="token func tion">rdma_get_rec v_c omp class="token punc tuation">( idclass="token punc tuation">, class="token operator">& wc class="token punc tuation">) class="token punc tuation">) class="token operator">== class="token number">0 class="token punc tuation">) class="token punc tuation">;
class="token keyword">if class="token punc tuation">( ret class="token operator">< class="token number">0 class="token punc tuation">)
class="token func tion">perror class="token punc tuation">( class="token string">"rdma_get_rec v_c omp" class="token punc tuation">) class="token punc tuation">;
class="token keyword">else
ret class="token operator">= class="token number">0 class="token punc tuation">;
class="token keyword">if class="token punc tuation">( class="token func tion">strc mp class="token punc tuation">( class="token punc tuation">( class="token keyword">c har class="token operator">* class="token punc tuation">) send_msgclass="token punc tuation">, class="token string">"disc onnec t" class="token punc tuation">) class="token operator">== class="token number">0 class="token punc tuation">)
class="token punc tuation">{
class="token func tion">printf class="token punc tuation">( class="token string">"disc onnec t\n" class="token punc tuation">) class="token punc tuation">;
class="token keyword">goto out_disc onnec tclass="token punc tuation">;
class="token punc tuation">}
class="token keyword">else
class="token punc tuation">{
class="token func tion">printf class="token punc tuation">( class="token string">"%s\n" class="token punc tuation">, rec v_msgclass="token punc tuation">) class="token punc tuation">;
class="token punc tuation">}
class="token punc tuation">}
out_disc onnec tclass="token operator">:
class="token func tion">rdma_disc onnec t class="token punc tuation">( idclass="token punc tuation">) class="token punc tuation">;
out_dereg_sendclass="token operator">:
class="token keyword">if class="token punc tuation">( class="token punc tuation">( send_flags class="token operator">& IBV_SEND_INLINEclass="token punc tuation">) class="token operator">== class="token number">0 class="token punc tuation">)
class="token func tion">rdma_dereg_mr class="token punc tuation">( send_mrclass="token punc tuation">) class="token punc tuation">;
out_dereg_rec vclass="token operator">:
class="token func tion">rdma_dereg_mr class="token punc tuation">( mrclass="token punc tuation">) class="token punc tuation">;
out_destroy_epclass="token operator">:
class="token func tion">rdma_destroy_ep class="token punc tuation">( idclass="token punc tuation">) class="token punc tuation">;
out_free_addrinfoclass="token operator">:
class="token func tion">rdma_freeaddrinfo class="token punc tuation">( resclass="token punc tuation">) class="token punc tuation">;
outclass="token operator">:
class="token keyword">return retclass="token punc tuation">;
class="token punc tuation">}
class="token keyword">int class="token func tion">main class="token punc tuation">( class="token keyword">int argc class="token punc tuation">, class="token keyword">c har class="token operator">* class="token operator">* argvclass="token punc tuation">)
class="token punc tuation">{
class="token keyword">int retclass="token punc tuation">;
class="token c omment">//memc py(send_msg, argv[1], 50);
class="token c omment">// while ((op = getopt(argc , argv, "s:p:")) != -1) {
class="token c omment">// switc h (op) {
class="token c omment">// c ase 's':
class="token c omment">// server = optarg;
class="token c omment">// break;
class="token c omment">// c ase 'p':
class="token c omment">// port = optarg;
class="token c omment">// break;
class="token c omment">// default:
class="token c omment">// printf("usage: %s\n", argv[0]);
class="token c omment">// printf("\t[-s server_address]\n");
class="token c omment">// printf("\t[-p port_number]\n");
class="token c omment">// exit(1);
class="token c omment">// }
class="token c omment">// }
class="token func tion">printf class="token punc tuation">( class="token string">"rdma_c lient: start\n" class="token punc tuation">) class="token punc tuation">;
ret class="token operator">= class="token func tion">run class="token punc tuation">( class="token punc tuation">) class="token punc tuation">;
class="token func tion">printf class="token punc tuation">( class="token string">"rdma_c lient: end %d\n" class="token punc tuation">, retclass="token punc tuation">) class="token punc tuation">;
class="token keyword">return retclass="token punc tuation">;
class="token punc tuation">}
c ode>
<c ode c lass="prism language-c ">class="token c omment">// server3.c
class="token c omment">/*
* Copyright (c ) 2005-2009 Intel Corporation. All rights reserved.
*
* This software is available to you under the OpenIB.org BSD lic ense
* below:
*
* Redistribution and use in sourc e and binary forms, with or
* without modific ation, are permitted provided that the following
* c onditions are met:
*
* - Redistributions of sourc e c ode must retain the above
* c opyright notic e, this list of c onditions and the following
* disc laimer.
*
* - Redistributions in binary form must reproduc e the above
* c opyright notic e, this list of c onditions and the following
* disc laimer in the doc umentation and/or other materials
* provided with the distribution.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AWV
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
class="token mac ro property">class="token direc tive-hash"># class="token direc tive keyword">inc lude class="token string"><stdio.h>
class="token mac ro property">class="token direc tive-hash"># class="token direc tive keyword">inc lude class="token string"><stdlib.h>
class="token mac ro property">class="token direc tive-hash"># class="token direc tive keyword">inc lude class="token string"><string.h>
class="token mac ro property">class="token direc tive-hash"># class="token direc tive keyword">inc lude class="token string"><errno.h>
class="token mac ro property">class="token direc tive-hash"># class="token direc tive keyword">inc lude class="token string"><getopt.h>
class="token mac ro property">class="token direc tive-hash"># class="token direc tive keyword">inc lude class="token string"><netdb.h>
class="token mac ro property">class="token direc tive-hash"># class="token direc tive keyword">inc lude class="token string"><rdma/rdma_c ma.h>
class="token mac ro property">class="token direc tive-hash"># class="token direc tive keyword">inc lude class="token string"><rdma/rdma_verbs.h>
class="token mac ro property">class="token direc tive-hash"># class="token direc tive keyword">define class="token mac ro-name">N class="token expression">class="token number">100
class="token mac ro property">class="token direc tive-hash"># class="token direc tive keyword">define class="token mac ro-name">MAX_CAP class="token expression">class="token number">32
class="token keyword">static class="token keyword">c onst class="token keyword">c har class="token operator">* server class="token operator">= class="token string">"0.0.0.0" class="token punc tuation">;
class="token keyword">static class="token keyword">c onst class="token keyword">c har class="token operator">* port class="token operator">= class="token string">"7471" class="token punc tuation">;
class="token keyword">static class="token keyword">struc t class="token c lass-name">rdma_c m_id class="token operator">* listen_idclass="token punc tuation">, class="token operator">* idclass="token punc tuation">;
class="token keyword">static class="token keyword">struc t class="token c lass-name">ibv_mr class="token operator">* mrclass="token punc tuation">, class="token operator">* send_mrclass="token punc tuation">;
class="token keyword">static class="token keyword">int send_flagsclass="token punc tuation">;
class="token keyword">static class="token c lass-name">uint8_t send_msgclass="token punc tuation">[ MAX_CAPclass="token punc tuation">] class="token punc tuation">;
class="token keyword">static class="token c lass-name">uint8_t rec v_msgclass="token punc tuation">[ MAX_CAPclass="token punc tuation">] class="token punc tuation">;
class="token keyword">static class="token keyword">int class="token func tion">run class="token punc tuation">( class="token keyword">void class="token punc tuation">)
class="token punc tuation">{
class="token keyword">struc t class="token c lass-name">rdma_addrinfo hintsclass="token punc tuation">, class="token operator">* resclass="token punc tuation">;
class="token keyword">struc t class="token c lass-name">ibv_qp_init_attr init_attrclass="token punc tuation">;
class="token keyword">struc t class="token c lass-name">ibv_qp_attr qp_attrclass="token punc tuation">;
class="token keyword">struc t class="token c lass-name">ibv_wc wc class="token punc tuation">;
class="token keyword">int retclass="token punc tuation">;
c onnec tclass="token operator">:
class="token func tion">memset class="token punc tuation">( class="token operator">& hintsclass="token punc tuation">, class="token number">0 class="token punc tuation">, class="token keyword">sizeof hintsclass="token punc tuation">) class="token punc tuation">;
hintsclass="token punc tuation">. ai_flags class="token operator">= RAI_PASSIVEclass="token punc tuation">;
hintsclass="token punc tuation">. ai_port_spac e class="token operator">= c lass="tags" href="/tags/RDMA.html" title=RDMA>RDMA_PS_TCPclass="token punc tuation">;
ret class="token operator">= class="token func tion">rdma_getaddrinfo class="token punc tuation">( serverclass="token punc tuation">, portclass="token punc tuation">, class="token operator">& hintsclass="token punc tuation">, class="token operator">& resclass="token punc tuation">) class="token punc tuation">;
class="token keyword">if class="token punc tuation">( retclass="token punc tuation">) class="token punc tuation">{
class="token func tion">printf class="token punc tuation">( class="token string">"rdma_getaddrinfo: %s\n" class="token punc tuation">, class="token func tion">gai_strerror class="token punc tuation">( retclass="token punc tuation">) class="token punc tuation">) class="token punc tuation">;
class="token keyword">return retclass="token punc tuation">;
class="token punc tuation">}
class="token func tion">memset class="token punc tuation">( class="token operator">& init_attrclass="token punc tuation">, class="token number">0 class="token punc tuation">, class="token keyword">sizeof init_attrclass="token punc tuation">) class="token punc tuation">;
init_attrclass="token punc tuation">. c apclass="token punc tuation">. max_send_wr class="token operator">= init_attrclass="token punc tuation">. c apclass="token punc tuation">. max_rec v_wr class="token operator">= Nclass="token punc tuation">;
init_attrclass="token punc tuation">. c apclass="token punc tuation">. max_send_sge class="token operator">= init_attrclass="token punc tuation">. c apclass="token punc tuation">. max_rec v_sge class="token operator">= class="token number">1 class="token punc tuation">;
init_attrclass="token punc tuation">. c apclass="token punc tuation">. max_inline_data class="token operator">= MAX_CAPclass="token punc tuation">;
init_attrclass="token punc tuation">. sq_sig_all class="token operator">= class="token number">1 class="token punc tuation">;
ret class="token operator">= class="token func tion">rdma_c reate_ep class="token punc tuation">( class="token operator">& listen_idclass="token punc tuation">, resclass="token punc tuation">, class="token c onstant">NULL class="token punc tuation">, class="token operator">& init_attrclass="token punc tuation">) class="token punc tuation">;
class="token keyword">if class="token punc tuation">( retclass="token punc tuation">) class="token punc tuation">{
class="token func tion">perror class="token punc tuation">( class="token string">"rdma_c reate_ep" class="token punc tuation">) class="token punc tuation">;
class="token keyword">goto out_free_addrinfoclass="token punc tuation">;
class="token punc tuation">}
ret class="token operator">= class="token func tion">rdma_listen class="token punc tuation">( listen_idclass="token punc tuation">, class="token number">0 class="token punc tuation">) class="token punc tuation">;
class="token keyword">if class="token punc tuation">( retclass="token punc tuation">) class="token punc tuation">{
class="token func tion">perror class="token punc tuation">( class="token string">"rdma_listen" class="token punc tuation">) class="token punc tuation">;
class="token keyword">goto out_destroy_listen_epclass="token punc tuation">;
class="token punc tuation">}
ret class="token operator">= class="token func tion">rdma_get_request class="token punc tuation">( listen_idclass="token punc tuation">, class="token operator">& idclass="token punc tuation">) class="token punc tuation">;
class="token keyword">if class="token punc tuation">( retclass="token punc tuation">) class="token punc tuation">{
class="token func tion">perror class="token punc tuation">( class="token string">"rdma_get_request" class="token punc tuation">) class="token punc tuation">;
class="token keyword">goto out_destroy_listen_epclass="token punc tuation">;
class="token punc tuation">}
class="token func tion">memset class="token punc tuation">( class="token operator">& qp_attrclass="token punc tuation">, class="token number">0 class="token punc tuation">, class="token keyword">sizeof qp_attrclass="token punc tuation">) class="token punc tuation">;
class="token func tion">memset class="token punc tuation">( class="token operator">& init_attrclass="token punc tuation">, class="token number">0 class="token punc tuation">, class="token keyword">sizeof init_attrclass="token punc tuation">) class="token punc tuation">;
ret class="token operator">= class="token func tion">ibv_query_qp class="token punc tuation">( idclass="token operator">-> qpclass="token punc tuation">, class="token operator">& qp_attrclass="token punc tuation">, IBV_QP_CAPclass="token punc tuation">,
class="token operator">& init_attrclass="token punc tuation">) class="token punc tuation">;
class="token keyword">if class="token punc tuation">( retclass="token punc tuation">) class="token punc tuation">{
class="token func tion">perror class="token punc tuation">( class="token string">"ibv_query_qp" class="token punc tuation">) class="token punc tuation">;
class="token keyword">goto out_destroy_ac c ept_epclass="token punc tuation">;
class="token punc tuation">}
class="token keyword">if class="token punc tuation">( init_attrclass="token punc tuation">. c apclass="token punc tuation">. max_inline_data class="token operator">>= MAX_CAPclass="token punc tuation">)
send_flags class="token operator">= IBV_SEND_INLINEclass="token punc tuation">;
class="token keyword">else
class="token func tion">printf class="token punc tuation">( class="token string">"rdma_server: devic e doesn't support IBV_SEND_INLINE, "
class="token string">"using sge sends\n" class="token punc tuation">) class="token punc tuation">;
mr class="token operator">= class="token func tion">rdma_reg_msgs class="token punc tuation">( idclass="token punc tuation">, rec v_msgclass="token punc tuation">, Nclass="token punc tuation">) class="token punc tuation">;
class="token keyword">if class="token punc tuation">( class="token operator">! mrclass="token punc tuation">) class="token punc tuation">{
ret class="token operator">= class="token operator">- class="token number">1 class="token punc tuation">;
class="token func tion">perror class="token punc tuation">( class="token string">"rdma_reg_msgs for rec v_msg" class="token punc tuation">) class="token punc tuation">;
class="token keyword">goto out_destroy_ac c ept_epclass="token punc tuation">;
class="token punc tuation">}
class="token keyword">if class="token punc tuation">( class="token punc tuation">( send_flags class="token operator">& IBV_SEND_INLINEclass="token punc tuation">) class="token operator">== class="token number">0 class="token punc tuation">) class="token punc tuation">{
send_mr class="token operator">= class="token func tion">rdma_reg_msgs class="token punc tuation">( idclass="token punc tuation">, send_msgclass="token punc tuation">, MAX_CAPclass="token punc tuation">) class="token punc tuation">;
class="token keyword">if class="token punc tuation">( class="token operator">! send_mrclass="token punc tuation">) class="token punc tuation">{
ret class="token operator">= class="token operator">- class="token number">1 class="token punc tuation">;
class="token func tion">perror class="token punc tuation">( class="token string">"rdma_reg_msgs for send_msg" class="token punc tuation">) class="token punc tuation">;
class="token keyword">goto out_dereg_rec vclass="token punc tuation">;
class="token punc tuation">}
class="token punc tuation">}
ret class="token operator">= class="token func tion">rdma_ac c ept class="token punc tuation">( idclass="token punc tuation">, class="token c onstant">NULL class="token punc tuation">) class="token punc tuation">;
class="token keyword">if class="token punc tuation">( retclass="token punc tuation">) class="token punc tuation">{
class="token func tion">perror class="token punc tuation">( class="token string">"rdma_ac c ept" class="token punc tuation">) class="token punc tuation">;
class="token keyword">goto out_dereg_sendclass="token punc tuation">;
class="token punc tuation">}
class="token keyword">while class="token punc tuation">( class="token number">1 class="token punc tuation">) class="token punc tuation">{
class="token func tion">memset class="token punc tuation">( rec v_msgclass="token punc tuation">, class="token number">0 class="token punc tuation">, class="token keyword">sizeof rec v_msgclass="token punc tuation">) class="token punc tuation">;
class="token func tion">memset class="token punc tuation">( send_msgclass="token punc tuation">, class="token number">0 class="token punc tuation">, class="token keyword">sizeof send_msgclass="token punc tuation">) class="token punc tuation">;
ret class="token operator">= class="token func tion">rdma_post_rec v class="token punc tuation">( idclass="token punc tuation">, class="token c onstant">NULL class="token punc tuation">, rec v_msgclass="token punc tuation">, MAX_CAPclass="token punc tuation">, mrclass="token punc tuation">) class="token punc tuation">;
class="token keyword">if class="token punc tuation">( retclass="token punc tuation">) class="token punc tuation">{
class="token func tion">perror class="token punc tuation">( class="token string">"rdma_post_rec v" class="token punc tuation">) class="token punc tuation">;
class="token keyword">goto out_dereg_sendclass="token punc tuation">;
class="token punc tuation">}
class="token keyword">while class="token punc tuation">( class="token punc tuation">( ret class="token operator">= class="token func tion">rdma_get_rec v_c omp class="token punc tuation">( idclass="token punc tuation">, class="token operator">& wc class="token punc tuation">) class="token punc tuation">) class="token operator">== class="token number">0 class="token punc tuation">) class="token punc tuation">;
class="token keyword">if class="token punc tuation">( ret class="token operator">< class="token number">0 class="token punc tuation">) class="token punc tuation">{
class="token func tion">perror class="token punc tuation">( class="token string">"rdma_get_rec v_c omp" class="token punc tuation">) class="token punc tuation">;
class="token keyword">goto out_disc onnec tclass="token punc tuation">;
class="token punc tuation">}
class="token keyword">c har class="token operator">* s class="token operator">= class="token punc tuation">( class="token keyword">c har class="token operator">* class="token punc tuation">) rec v_msgclass="token punc tuation">;
class="token keyword">int total_length class="token operator">= class="token func tion">strlen class="token punc tuation">( class="token string">"server get " class="token punc tuation">) class="token operator">+ class="token func tion">strlen class="token punc tuation">( sclass="token punc tuation">) class="token punc tuation">; class="token c omment">// 加1是为了存储字符串结束符'\0'
class="token keyword">c har class="token operator">* rec v_str class="token operator">= class="token punc tuation">( class="token keyword">c har class="token operator">* class="token punc tuation">) class="token func tion">malloc class="token punc tuation">( total_lengthclass="token punc tuation">) class="token punc tuation">; class="token c omment">// 分配足够的空间
class="token func tion">strc py class="token punc tuation">( rec v_strclass="token punc tuation">, class="token string">"server get " class="token punc tuation">) class="token punc tuation">;
class="token func tion">strc at class="token punc tuation">( rec v_strclass="token punc tuation">, sclass="token punc tuation">) class="token punc tuation">;
class="token c omment">//printf("%s\n", rec v_str);
class="token func tion">memc py class="token punc tuation">( send_msgclass="token punc tuation">, rec v_strclass="token punc tuation">, class="token func tion">strlen class="token punc tuation">( rec v_strclass="token punc tuation">) class="token punc tuation">) class="token punc tuation">;
ret class="token operator">= class="token func tion">rdma_post_send class="token punc tuation">( idclass="token punc tuation">, class="token c onstant">NULL class="token punc tuation">, send_msgclass="token punc tuation">, MAX_CAPclass="token punc tuation">, send_mrclass="token punc tuation">, send_flagsclass="token punc tuation">) class="token punc tuation">;
class="token keyword">if class="token punc tuation">( retclass="token punc tuation">) class="token punc tuation">{
class="token func tion">perror class="token punc tuation">( class="token string">"rdma_post_send" class="token punc tuation">) class="token punc tuation">;
class="token keyword">goto out_disc onnec tclass="token punc tuation">;
class="token punc tuation">}
class="token keyword">if class="token punc tuation">( class="token func tion">strc mp class="token punc tuation">( class="token punc tuation">( class="token keyword">c har class="token operator">* class="token punc tuation">) rec v_msgclass="token punc tuation">, class="token string">"disc onnec t" class="token punc tuation">) class="token operator">== class="token number">0 class="token punc tuation">)
class="token punc tuation">{
class="token c omment">//printf("%s\n",rec v_msg);
class="token func tion">printf class="token punc tuation">( class="token string">"c lient disc onnec t\n" class="token punc tuation">) class="token punc tuation">;
class="token func tion">rdma_disc onnec t class="token punc tuation">( idclass="token punc tuation">) class="token punc tuation">;
class="token keyword">if class="token punc tuation">( class="token punc tuation">( send_flags class="token operator">& IBV_SEND_INLINEclass="token punc tuation">) class="token operator">== class="token number">0 class="token punc tuation">)
class="token func tion">rdma_dereg_mr class="token punc tuation">( send_mrclass="token punc tuation">) class="token punc tuation">;
class="token func tion">rdma_dereg_mr class="token punc tuation">( mrclass="token punc tuation">) class="token punc tuation">;
class="token func tion">rdma_destroy_ep class="token punc tuation">( idclass="token punc tuation">) class="token punc tuation">;
class="token func tion">rdma_destroy_ep class="token punc tuation">( listen_idclass="token punc tuation">) class="token punc tuation">;
class="token func tion">rdma_freeaddrinfo class="token punc tuation">( resclass="token punc tuation">) class="token punc tuation">;
class="token c omment">//goto out_disc onnec t;
class="token keyword">goto c onnec tclass="token punc tuation">;
class="token punc tuation">}
class="token keyword">else
class="token punc tuation">{
class="token func tion">printf class="token punc tuation">( class="token string">"%s\n" class="token punc tuation">, rec v_msgclass="token punc tuation">) class="token punc tuation">;
class="token punc tuation">}
class="token c omment">// while ((ret = rdma_get_send_c omp(id, &wc )) == 0); // 确认对方已经收到 对方发送ac k
class="token c omment">// printf("after send\n");
class="token c omment">// if (ret < 0)
class="token c omment">// perror("rdma_get_send_c omp");
class="token c omment">// else
class="token c omment">// ret = 0;
class="token punc tuation">}
out_disc onnec tclass="token operator">:
class="token func tion">rdma_disc onnec t class="token punc tuation">( idclass="token punc tuation">) class="token punc tuation">;
out_dereg_sendclass="token operator">:
class="token keyword">if class="token punc tuation">( class="token punc tuation">( send_flags class="token operator">& IBV_SEND_INLINEclass="token punc tuation">) class="token operator">== class="token number">0 class="token punc tuation">)
class="token func tion">rdma_dereg_mr class="token punc tuation">( send_mrclass="token punc tuation">) class="token punc tuation">;
out_dereg_rec vclass="token operator">:
class="token func tion">rdma_dereg_mr class="token punc tuation">( mrclass="token punc tuation">) class="token punc tuation">;
out_destroy_ac c ept_epclass="token operator">:
class="token func tion">rdma_destroy_ep class="token punc tuation">( idclass="token punc tuation">) class="token punc tuation">;
out_destroy_listen_epclass="token operator">:
class="token func tion">rdma_destroy_ep class="token punc tuation">( listen_idclass="token punc tuation">) class="token punc tuation">;
out_free_addrinfoclass="token operator">:
class="token func tion">rdma_freeaddrinfo class="token punc tuation">( resclass="token punc tuation">) class="token punc tuation">;
class="token keyword">return retclass="token punc tuation">;
class="token punc tuation">}
class="token keyword">int class="token func tion">main class="token punc tuation">( class="token keyword">int argc class="token punc tuation">, class="token keyword">c har class="token operator">* class="token operator">* argvclass="token punc tuation">)
class="token punc tuation">{
class="token keyword">int opclass="token punc tuation">, retclass="token punc tuation">;
class="token keyword">while class="token punc tuation">( class="token punc tuation">( op class="token operator">= class="token func tion">getopt class="token punc tuation">( argc class="token punc tuation">, argvclass="token punc tuation">, class="token string">"s:p:" class="token punc tuation">) class="token punc tuation">) class="token operator">!= class="token operator">- class="token number">1 class="token punc tuation">) class="token punc tuation">{
class="token keyword">switc h class="token punc tuation">( opclass="token punc tuation">) class="token punc tuation">{
class="token keyword">c ase class="token c har">'s' class="token operator">:
server class="token operator">= optargclass="token punc tuation">;
class="token keyword">break class="token punc tuation">;
class="token keyword">c ase class="token c har">'p' class="token operator">:
port class="token operator">= optargclass="token punc tuation">;
class="token keyword">break class="token punc tuation">;
class="token keyword">default class="token operator">:
class="token func tion">printf class="token punc tuation">( class="token string">"usage: %s\n" class="token punc tuation">, argvclass="token punc tuation">[ class="token number">0 class="token punc tuation">] class="token punc tuation">) class="token punc tuation">;
class="token func tion">printf class="token punc tuation">( class="token string">"\t[-s server_address]\n" class="token punc tuation">) class="token punc tuation">;
class="token func tion">printf class="token punc tuation">( class="token string">"\t[-p port_number]\n" class="token punc tuation">) class="token punc tuation">;
class="token func tion">exit class="token punc tuation">( class="token number">1 class="token punc tuation">) class="token punc tuation">;
class="token punc tuation">}
class="token punc tuation">}
class="token func tion">printf class="token punc tuation">( class="token string">"rdma_server: start\n" class="token punc tuation">) class="token punc tuation">;
ret class="token operator">= class="token func tion">run class="token punc tuation">( class="token punc tuation">) class="token punc tuation">;
class="token func tion">printf class="token punc tuation">( class="token string">"rdma_server: end %d\n" class="token punc tuation">, retclass="token punc tuation">) class="token punc tuation">;
class="token keyword">return retclass="token punc tuation">;
class="token punc tuation">}
c ode>
运行结果:
c="https://img-blog.c sdnimg.c n/direc t/76802b77390d49408f8ad6c 7f36f231b.png" alt="在这里插入图片描述" /> c="https://img-blog.c sdnimg.c n/direc t/f25ab9d197df4d3aa1e2d2220c e4587b.png" alt="在这里插入图片描述" />
总结:
本文实现了rdma中c lass="tags" href="/tags/SEND-RECEIVE.html" title=send-rec eive>send-rec eive双边原语的三种需求版本c ;从单次发送到两者都能多次发送。理解其中的代码逻辑c ;想要发送消息之前对端得创建一个rec v队列用来接收消息 。发送完了有一个发送完成队列c ;接收完了也有一个接收完成队列。最后双方断开连接需要一起断开c ;不能某一方执行disc onnec t另一方不执行。本次实验有一个关键点:
<c ode>while ((ret = rdma_get_send_c omp(id, &wc )) == 0)
c ode>
这一行代码是等待发送成功c ;发送成功之后c ;对方会给一个隐式信息表示我已经收到。这里耗费得时间比较长一点c ;在版本3中c ;如果不注释掉c ;在server端的rec eive队列还没有建立好c ;这就导致c lient发送了消息c ;server还没有收到c ;双方就陷入了死循环中。