首页 > 其他分享 >rdma-core之rdma_client.c

rdma-core之rdma_client.c

时间:2023-07-28 11:34:37浏览次数:30  
标签:core ret client rdma send mr recv out

库函数、全局变量

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <netdb.h>
#include <errno.h>
#include <getopt.h>
#include <rdma/rdma_cma.h>
#include <rdma/rdma_verbs.h>

static const char *server = "127.0.0.1"; // ip地址
static const char *port = "7471"; // 端口信息(这个端口是标准的soft-core)

static struct rdma_cm_id *id; // cm管理器描述符
static struct ibv_mr *mr, *send_mr; // 注册的mr信息
static int send_flags; // 发送的标识符
static uint8_t send_msg[16]; // 发送消息的大小
static uint8_t recv_msg[16]; // 接收消息的大小

main函数

首先分析相关的命令参数,开始运行run函数。


int main(int argc, char **argv)
{
	int op, ret;

	while ((op = getopt(argc, argv, "s:p:")) != -1) {
		switch (op) {
		case 's':
			server = optarg;
			break;
		case 'p':
			port = optarg;
			break;
		default:
			printf("usage: %s\n", argv[0]);
			printf("\t[-s server_address]\n");
			printf("\t[-p port_number]\n");
			exit(1);
		}
	}

	printf("rdma_client: start\n");
	ret = run();
	printf("rdma_client: end %d\n", ret);
	return ret;
}

run函数


static int run(void)
{
	struct rdma_addrinfo hints, *res; // rdma地址信息存储
	struct ibv_qp_init_attr attr; // qp的属性,里面存储了qp的信息,以及上下文嘻嘻等
	struct ibv_wc wc; // wc表示的是完成事件
	int ret;

	memset(&hints, 0, sizeof hints);
	hints.ai_port_space = RDMA_PS_TCP; // 使用TCP的方式建立连接
	ret = rdma_getaddrinfo(server, port, &hints, &res); // 验证服务器地址和端口的有效性
	if (ret) {
		printf("rdma_getaddrinfo: %s\n", gai_strerror(ret));
		goto out;
	}

	// 表示配置qp信息
	memset(&attr, 0, sizeof attr);
	attr.cap.max_send_wr = attr.cap.max_recv_wr = 1;
	attr.cap.max_send_sge = attr.cap.max_recv_sge = 1;
	attr.cap.max_inline_data = 16;
	attr.qp_context = id;
	attr.sq_sig_all = 1;
	ret = rdma_create_ep(&id, res, NULL, &attr); // 创建一个终端节点,这个终端节点里面包含了所有的信息。
	// Check to see if we got inline data allowed or not
	if (attr.cap.max_inline_data >= 16) // 这个表示我们当前支持IBV_SEND_INLINE
		send_flags = IBV_SEND_INLINE;
	else
		printf("rdma_client: device doesn't support IBV_SEND_INLINE, "
		       "using sge sends\n");

	if (ret) {
		perror("rdma_create_ep");
		goto out_free_addrinfo;
	}

	mr = rdma_reg_msgs(id, recv_msg, 16); // 创建mr信息,并且把相关的recv_msg和相关的信息存储在mr里面。
	if (!mr) {
		perror("rdma_reg_msgs for recv_msg");
		ret = -1;
		goto out_destroy_ep;
	}
	if ((send_flags & IBV_SEND_INLINE) == 0) {
		send_mr = rdma_reg_msgs(id, send_msg, 16); // 创建一个send_mr用于发送数据。
		if (!send_mr) {
			perror("rdma_reg_msgs for send_msg");
			ret = -1;
			goto out_dereg_recv;
		}
	}

	ret = rdma_post_recv(id, NULL, recv_msg, 16, mr); // 发送一个WR到RQ队列中,把数据的接收存放到mr里面。
	if (ret) {
		perror("rdma_post_recv");
		goto out_dereg_send;
	}

	ret = rdma_connect(id, NULL); // 发起连接的建立
	if (ret) {
		perror("rdma_connect");
		goto out_dereg_send;
	}
 // 同理一样,这个用于发送,从send_mr发送数据出去
	ret = rdma_post_send(id, NULL, send_msg, 16, send_mr, send_flags);
	if (ret) {
		perror("rdma_post_send");
		goto out_disconnect;
	}
 // 检查是否发送成功
	while ((ret = rdma_get_send_comp(id, &wc)) == 0);
	if (ret < 0) {
		perror("rdma_get_send_comp");
		goto out_disconnect;
	}
	// 检查是否接收成
	while ((ret = rdma_get_recv_comp(id, &wc)) == 0);
	if (ret < 0)
		perror("rdma_get_recv_comp");
	else
		ret = 0;

out_disconnect:
	rdma_disconnect(id);
out_dereg_send:
	if ((send_flags & IBV_SEND_INLINE) == 0)
		rdma_dereg_mr(send_mr);
out_dereg_recv:
	rdma_dereg_mr(mr);
out_destroy_ep:
	rdma_destroy_ep(id);
out_free_addrinfo:
	rdma_freeaddrinfo(res);
out:
	return ret;
}

总结:描述了客户端想服务器发送和接收的一个过程。

标签:core,ret,client,rdma,send,mr,recv,out
From: https://blog.51cto.com/u_14834110/6879818

相关文章

  • apache net FTPClient 通过 Http 代理访问 FTP服务器
    前言因为特殊原因,需要在服务器上安装一个代理程序,通过代理程序才能访问到安全域内的一台指定IP服务器。该服务器上安装了FTP服务,需要用程序读写FTP上的文件。之前在不使用代理程序的服务器上测试FTP连接,没有任何问题,换到这台服务器上有问题,所以记录一下处理过程。文章目录前言问......
  • postgresql 数据库 报错 FATAL: sorry, too many clients already 解决方法
    场景项目postgres连接不上,所有连接报错:psql:FATAL:sorry,toomanyclientsalready原由程序使用连接未及时释放,连接一直处于idle状态处理方式1、程序里面未释放的连接,在使用后及时释放;2、postgres连接数默认最大100个,在配置文件修改该参数;postgres.confmax_con......
  • NET7下EFCORE的通用增删查改类
    NET7下EFCORE的通用增删查改类代码摘录自《深入浅出ASP.NETCORE》 ///<summary>///所有仓储的约定,此接口仅作为约定,用于标识他们///</summary>///<typeparamname="TEntity">传入仓储的实体模型</typeparam>///<typeparamname="TPrimaryKey&quo......
  • asp.net core之配置
    简介配置在asp.netcore中可以说是我们必不可少一部分。ASP.NETCore中的应用程序配置是使用一个或多个配置提供程序执行的。配置提供程序使用各种配置源从键值对读取配置数据,普通最常用的应该是下面几种:设置文件,例如appsettings.json环境变量命令行参数已安装或已创建......
  • VS 还原 NuGet 程序包时出错: 无法加载源 https://dotnet.myget.org/F/aspnetcore-dev
    错误还原NuGet程序包时出错:无法加载源https://dotnet.myget.org/F/aspnetcore-dev/api/v3解决方法在新源中添加地址:https://www.nuget.org/api/v2/......
  • ASP.NET Core 使用 Claim 认证详解
    微软在早期.NETFramework时代,针对ASP.NET的用户登录身份认证,提供了Forms认证实现方案。后来在推出ASP.NETCore之后,采用Claim认证替代了Forms认证,两者本质上都是基于Cookie加解密的认证方式,学习和使用起来非常简单,比较适合在小型项目中使用,主要是方便。假设我们现......
  • ASP.NET Core 授权中间件 AuthorizationMiddleware
    ///<summary>///Amiddlewarethatenablesauthorizationcapabilities.///</summary>publicclassAuthorizationMiddleware{//AppContextswitchusedtocontrolwhetherHttpContextorendpointispassedasaresourcetoAuthZ......
  • .net core 调用打印机打印pdf文件 FreeSpire.PDF
    首先,参考了https://stackoverflow.com/questions/63941980/is-it-possible-to-print-documents-from-a-net-core-3-1-windows-service中的说明,声明:我用的是core3.1测试的先下载了FreeSpire.PDF的NuGet包,可以看出来简介上是支持print的: 然后我的测试直接在controller中:1[......
  • 使用ASP.NET Core Minimal API和MailKit发送电子邮件
    步骤1:创建新项目通过以下命令在终端中创建一个新的ASP.NETCoreWebAPI项目:dotnetnewwebapi-oSendingEmail由于我们正在使用MinimalAPIs,因此删除不必要的Controller文件夹和WeatherForecast类。步骤2:定义电子邮件数据传输对象(DTO)为了将数据从我们的API传递到邮件服务......
  • Azure OpenAI client library for .NET
    usingAzure;usingAzure.AI.OpenAI;OpenAIClientclient=newOpenAIClient( newUri("AZURE_OPENAI_ENDPOINT"), newAzureKeyCredential("AZURE_OPENAI_API_KEY"));Response<ChatCompletions>responseWithoutStream=awaitclient.Get......