忘记密码   免费注册 查看新帖 |

ChinaUnix.net

  平台 论坛 博客 文库 频道自动化运维 虚拟化 储存备份 C/C++ PHP MySQL 嵌入式 Linux系统
12下一页
最近访问板块 发新帖
查看: 3836 | 回复: 10

[C++] 请教一下,论坛里面有做RDMA模式下的网络层代码的吗?超算都是RDMA [复制链接]

论坛徽章:
9
程序设计版块每日发帖之星
日期:2015-10-18 06:20:00程序设计版块每日发帖之星
日期:2015-11-01 06:20:00程序设计版块每日发帖之星
日期:2015-11-02 06:20:00每日论坛发贴之星
日期:2015-11-02 06:20:00程序设计版块每日发帖之星
日期:2015-11-03 06:20:00程序设计版块每日发帖之星
日期:2015-11-04 06:20:00程序设计版块每日发帖之星
日期:2015-11-06 06:20:00数据库技术版块每周发帖之星
日期:2015-12-02 15:02:47数据库技术版块每日发帖之星
日期:2015-12-08 06:20:00
发表于 2016-11-08 18:36 |显示全部楼层
本帖最后由 wlmqgzm 于 2016-11-08 18:44 编辑

论坛里面有做RDMA模式下的网络层代码的吗? 下一段时间, 准备要做一套基于RDMA模式的网络层基础库代码,好像目前比较流行这个,主要是集群内部通讯使用的, 不知道论坛里弄这个的多吗?
RDMA模式的坑多不多, 主要有那些坑?
soft RoCE的性能如何? 目前rdma的测试性能Echo Server如何? 测试指标一般是多少?

论坛徽章:
9
程序设计版块每日发帖之星
日期:2015-10-18 06:20:00程序设计版块每日发帖之星
日期:2015-11-01 06:20:00程序设计版块每日发帖之星
日期:2015-11-02 06:20:00每日论坛发贴之星
日期:2015-11-02 06:20:00程序设计版块每日发帖之星
日期:2015-11-03 06:20:00程序设计版块每日发帖之星
日期:2015-11-04 06:20:00程序设计版块每日发帖之星
日期:2015-11-06 06:20:00数据库技术版块每周发帖之星
日期:2015-12-02 15:02:47数据库技术版块每日发帖之星
日期:2015-12-08 06:20:00
发表于 2016-11-09 12:12 |显示全部楼层
RDMA工作原理
普通网卡集成了支持硬件校验和的功能,并对软件进行了改进,从而减少了发送数据的拷贝量,但无法减少接收数据的拷贝量,而这部分拷贝量要占用CPU 的大量计算周期.普通网卡的工作过程如下:先把收到的数据包缓存到系统上,数据包经过处理后,相应数据被分配到一个TCP 连接;然后,接收系统再把主动提供的TCP 数据同相应的应用程序联系起来,并将数据从系统缓冲区拷贝到目标存储地址.这样,制约网络速率的因素就出现了:应用通信强度不断增加和主机CPU 在内核与应用存储器间处理数据的任务繁重使系统要不断追加主机CPU 资源,配置高效的软件并增强系统负荷管理.问题的关键是要消除主机CPU 中不必要的频繁数据传输,减少系统间的信息延迟。
RDMA 是通过网络把资料直接传入计算机的存储区,将数据从一个系统快速移动到远程系统存储器中,而不对操作系统造成任何影响,这样就不需要用到多少计算机的处理功能.它消除了外部存储器复制和文本交换操作,因而能腾出总线空间和CPU 周期用于改进应用系统性能. 通用的做法需由系统先对传入的信息进行分析与标记,然后再存储到正确的区域.整体结构如图所示。
RDMA 的工作过程如下:
1)当一个应用执行RDMA 读或写请求时,不执行任何数据复制.在不需要任何内核内存参与的条件下, RDMA 请求从运行在用户空间中的应用中发送到本地NIC( 网卡)。
2) NIC 读取缓冲的内容,并通过网络传送到远程NIC。
3) 在网络上传输的RDMA 信息包含目标虚拟地址、内存钥匙和数据本身.请求完成既可以完全在用户空间中处理(通过轮询用户级完成排列) ,或者在应用一直睡眠到请求完成时的情况下通过内核内存处理.RDMA 操作使应用可以从一个远程应用的内存中读数据或向这个内存写数据。
4) 目标NIC 确认内存钥匙,直接将数据写人应用缓存中.用于操作的远程虚拟内存地址包含在RDMA 信息中。

论坛徽章:
9
程序设计版块每日发帖之星
日期:2015-10-18 06:20:00程序设计版块每日发帖之星
日期:2015-11-01 06:20:00程序设计版块每日发帖之星
日期:2015-11-02 06:20:00每日论坛发贴之星
日期:2015-11-02 06:20:00程序设计版块每日发帖之星
日期:2015-11-03 06:20:00程序设计版块每日发帖之星
日期:2015-11-04 06:20:00程序设计版块每日发帖之星
日期:2015-11-06 06:20:00数据库技术版块每周发帖之星
日期:2015-12-02 15:02:47数据库技术版块每日发帖之星
日期:2015-12-08 06:20:00
发表于 2016-11-09 12:19 |显示全部楼层
RDMA over TCP

  以太网凭借其低投入、后向兼容、易升级、低运营成本优势在目前网络互连领域内占据统治地位,目前主流以太网速率是100 Mb/s和1000 Mb/s,下一代以太网速率将会升级到10 Gb/s。将RDMA特性增加到以太网中,将会降低主机处理器利用率,增加以太网升级到10 Gb/s的优点,消除由于升级到10 Gb/s而引入巨大开销的弊端,允许数据中心在不影响整体性能的前提下拓展机构,为未来扩展需求提供足够的灵活性。

  RDMA over TCP协议将数据直接在两个系统的应用内存之间进行交互,对操作系统内核几乎没有影响,并且不需要临时复制到系统内存的操作,数据流如图4.1所示。

  

  图4.1 RDMA over TCP (Ethernet)数据流示意图

  RDMA over TCP协议能够工作在标准的基于TCP/IP协议的网络,如目前在各个数据中心广泛使用的以太网。注意:RDMA over TCP并没有指定物理层信息,能够工作在任何使用TCP/IP协议的网络上层。RDMA over TCP允许很多传输类型来共享相同的物理连接,如网络、I/O、文件系统、块存储和处理器之间的消息通讯。

  

  图4.2 RDMA over TCP (Ethernet)协议栈

  图4.2是RDMA over TCP (Ethernet)的协议栈,最上面三层构成iWARP协议族,用来保证高速网络的互操作性。

  RDMA层协议负责根据RDMA写操作、RDMA读操作转换成RDMA消息,并将RDMA消息传向Direct Data Placement (DDP)层。DDP层协议负责将过长的RDMA消息分段封装成DDP数据包继续向下转发到Marker-based, Protocol-data-unit-Aligned (MPA)层。MPA层在DDP数据段的固定间隔位置增加一个后向标志、长度以及CRC校验数据,构成MPA数据段。TCP层负责对TCP数据段进行调度,确保发包能够顺利到达目标位置。IP层则在数据包中增加必要的网络路由数据信息。

  DDP层的PDU段的长度是固定的,DDP层含有一个成帧机制来分段和组合数据包,将过长的RDMA消息分段封装为DDP消息,处理过程如图4.3所示。

  

  图4.3 DDP层拆分RDMA消息示意图

  DDP数据段是DDP协议数据传输的最小数据单元,包含DDP协议头和ULP载荷。DDP协议头包含ULP数据的最终目的地址的位置和相关控制信息。DDP层将ULP数据分段的原因之一就是TCP载荷的最大长度限制。DDP的数据传输模式分为2种:tagged buffer方式和untagged buffer方式。tagged buffer方式一般应用于大数据量传输,例如磁盘I/O、大数据结构等;而untagged buffer方式一般应用于小的控制信息传输,例如:控制消息、I/O状态信息等。

  MPA层在DDP层传递下来的DDP消息中,MPA层通过增加MPA协议头、标志数据以及CRC校验数据构成FPDU(framed PDU )数据段,处理过程如图4.4所示。

  MPA层便于对端网络适配器设备能够快速定位DDP协议头数据,根据DDP协议头内设置的控制信息将数据直接置入相应的应用内存区域。MPA层具备错序校正能力,通过使能DDP,MPA避免内存复制的开销,减少处理乱序数据包和丢失数据包时对内存的需求。MPA将FPDU数据段传送给TCP层处理。

  

  图4.4 MPA层拆分DDP消息示意图

  TCP层将FPDU数据段拆放置在TCP数据段中,确保每个TCP数据段中都包含1个单独的FDPU。MPA接收端重新组装为完整的FPDU,验证数据完整性,将无用的信息段去除,然后将完整的DDP消息发送到DDP层进行处理。DDP 允许DDP数据段中的ULP协议(Upper Layer Protocol)数据,例如应用消息或磁盘I/O数据,不需要经过ULP的处理而直接放置在目的地址的内存中,即使DDP数据段乱序也不影响这种操作。

论坛徽章:
9
程序设计版块每日发帖之星
日期:2015-10-18 06:20:00程序设计版块每日发帖之星
日期:2015-11-01 06:20:00程序设计版块每日发帖之星
日期:2015-11-02 06:20:00每日论坛发贴之星
日期:2015-11-02 06:20:00程序设计版块每日发帖之星
日期:2015-11-03 06:20:00程序设计版块每日发帖之星
日期:2015-11-04 06:20:00程序设计版块每日发帖之星
日期:2015-11-06 06:20:00数据库技术版块每周发帖之星
日期:2015-12-02 15:02:47数据库技术版块每日发帖之星
日期:2015-12-08 06:20:00
发表于 2016-11-22 22:05 |显示全部楼层
已经把RDMA的Server/ Client范例调试编译执行成功, 总体上还没有遇到大的坑, 后面会抽时间, 做一个网络适配层, 还没有仔细测性能, 不过CPU确实消耗很小,......

论坛徽章:
257
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
发表于 2016-11-23 09:01 |显示全部楼层
wlmqgzm 发表于 2016-11-22 22:05
已经把RDMA的Server/ Client范例调试编译执行成功, 总体上还没有遇到大的坑, 后面会抽时间, 做一个网络适配 ...

只知道有RDMA这玩意,有点兴趣,能否分享一下?

论坛徽章:
9
程序设计版块每日发帖之星
日期:2015-10-18 06:20:00程序设计版块每日发帖之星
日期:2015-11-01 06:20:00程序设计版块每日发帖之星
日期:2015-11-02 06:20:00每日论坛发贴之星
日期:2015-11-02 06:20:00程序设计版块每日发帖之星
日期:2015-11-03 06:20:00程序设计版块每日发帖之星
日期:2015-11-04 06:20:00程序设计版块每日发帖之星
日期:2015-11-06 06:20:00数据库技术版块每周发帖之星
日期:2015-12-02 15:02:47数据库技术版块每日发帖之星
日期:2015-12-08 06:20:00
发表于 2016-11-27 14:11 |显示全部楼层
回复 5# hellioncu

好的, RDMA这个项目还处于前期搜集资料的过程中, 主要是一个新毕业的学生程序员在弄, 测试一些搜集的源代码, 我这边带一下安排指导一下, 有时间让他写点手册之类的东西, 到时候再分享给大家

上周忙了一周的 某Java项目 数据库框架重构设计, 写了22页的create Table, 救火中....唉



论坛徽章:
36
子鼠
日期:2013-08-28 22:23:29黄金圣斗士
日期:2015-12-01 11:37:51程序设计版块每日发帖之星
日期:2015-12-14 06:20:00CU十四周年纪念徽章
日期:2015-12-22 16:50:40IT运维版块每日发帖之星
日期:2016-01-25 06:20:0015-16赛季CBA联赛之深圳
日期:2016-01-27 10:31:172016猴年福章徽章
日期:2016-02-18 15:30:3415-16赛季CBA联赛之福建
日期:2016-04-07 11:25:2215-16赛季CBA联赛之青岛
日期:2016-04-29 18:02:5915-16赛季CBA联赛之北控
日期:2016-06-20 17:38:50技术图书徽章
日期:2016-07-19 13:54:03程序设计版块每日发帖之星
日期:2016-08-21 06:20:00
发表于 2016-11-29 11:51 |显示全部楼层
鉴定:楼主每次都是牛逼闪闪地来吹一波,并且说会分享代码,然后并不会分享出来。
ps:那种小段代码的分享不算吧

论坛徽章:
9
程序设计版块每日发帖之星
日期:2015-10-18 06:20:00程序设计版块每日发帖之星
日期:2015-11-01 06:20:00程序设计版块每日发帖之星
日期:2015-11-02 06:20:00每日论坛发贴之星
日期:2015-11-02 06:20:00程序设计版块每日发帖之星
日期:2015-11-03 06:20:00程序设计版块每日发帖之星
日期:2015-11-04 06:20:00程序设计版块每日发帖之星
日期:2015-11-06 06:20:00数据库技术版块每周发帖之星
日期:2015-12-02 15:02:47数据库技术版块每日发帖之星
日期:2015-12-08 06:20:00
发表于 2016-12-08 19:47 |显示全部楼层
/*
* Copyright (c) 2010 Intel Corporation.  All rights reserved.
*
* This software is available to you under the OpenIB.org BSD license
* below:
*
*     Redistribution and use in source and binary forms, with or
*     without modification, are permitted provided that the following
*     conditions are met:
*
*      - Redistributions of source code must retain the above
*        copyright notice, this list of conditions and the following
*        disclaimer.
*
*      - Redistributions in binary form must reproduce the above
*        copyright notice, this list of conditions and the following
*        disclaimer in the documentation 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.
*/

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

static char *server = "127.0.0.1";
static char *port = "7471";

struct rdma_cm_id *id;
struct ibv_mr *mr, *send_mr;
int send_flags;
uint8_t send_msg[16];
uint8_t recv_msg[16];

static int run(void)
{
        struct rdma_addrinfo hints, *res;
        struct ibv_qp_init_attr attr;
        struct ibv_wc wc;
        int ret;

        memset(&hints, 0, sizeof hints);
        hints.ai_port_space = RDMA_PS_TCP;
        ret = rdma_getaddrinfo(server, port, &hints, &res);
        if (ret) {
                perror("rdma_getaddrinfo");
                goto out;
        }

        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)
                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);
        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);
                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);
        if (ret) {
                perror("rdma_post_recv");
                goto out_dereg_send;
        }

        ret = rdma_connect(id, NULL);
        if (ret) {
                perror("rdma_connect");
                goto out_dereg_send;
        }

        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;
}

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;
}

论坛徽章:
9
程序设计版块每日发帖之星
日期:2015-10-18 06:20:00程序设计版块每日发帖之星
日期:2015-11-01 06:20:00程序设计版块每日发帖之星
日期:2015-11-02 06:20:00每日论坛发贴之星
日期:2015-11-02 06:20:00程序设计版块每日发帖之星
日期:2015-11-03 06:20:00程序设计版块每日发帖之星
日期:2015-11-04 06:20:00程序设计版块每日发帖之星
日期:2015-11-06 06:20:00数据库技术版块每周发帖之星
日期:2015-12-02 15:02:47数据库技术版块每日发帖之星
日期:2015-12-08 06:20:00
发表于 2016-12-08 19:54 |显示全部楼层
/*
* Copyright (c) 2005-2009 Intel Corporation.  All rights reserved.
*
* This software is available to you under the OpenIB.org BSD license
* below:
*
*     Redistribution and use in source and binary forms, with or
*     without modification, are permitted provided that the following
*     conditions are met:
*
*      - Redistributions of source code must retain the above
*        copyright notice, this list of conditions and the following
*        disclaimer.
*
*      - Redistributions in binary form must reproduce the above
*        copyright notice, this list of conditions and the following
*        disclaimer in the documentation 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.
*/

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

static char *port = "7471";

struct rdma_cm_id *listen_id, *id;
struct ibv_mr *mr, *send_mr;
int send_flags;
uint8_t send_msg[16];
uint8_t recv_msg[16];

static int run(void)
{
        struct rdma_addrinfo hints, *res;
        struct ibv_qp_init_attr init_attr;
        struct ibv_qp_attr qp_attr;
        struct ibv_wc wc;
        int ret;

        memset(&hints, 0, sizeof hints);
        hints.ai_flags = RAI_PASSIVE;
        hints.ai_port_space = RDMA_PS_TCP;
        ret = rdma_getaddrinfo(NULL, port, &hints, &res);
        if (ret) {
                perror("rdma_getaddrinfo");
                return ret;
        }

        memset(&init_attr, 0, sizeof init_attr);
        init_attr.cap.max_send_wr = init_attr.cap.max_recv_wr = 1;
        init_attr.cap.max_send_sge = init_attr.cap.max_recv_sge = 1;
        init_attr.cap.max_inline_data = 16;
        init_attr.sq_sig_all = 1;
        ret = rdma_create_ep(&listen_id, res, NULL, &init_attr);
        if (ret) {
                perror("rdma_create_ep");
                goto out_free_addrinfo;
        }

        ret = rdma_listen(listen_id, 0);
        if (ret) {
                perror("rdma_listen");
                goto out_destroy_listen_ep;
        }

        ret = rdma_get_request(listen_id, &id);
        if (ret) {
                perror("rdma_get_request");
                goto out_destroy_listen_ep;
        }

        memset(&qp_attr, 0, sizeof qp_attr);
        memset(&init_attr, 0, sizeof init_attr);
        ret = ibv_query_qp(id->qp, &qp_attr, IBV_QP_CAP,
                           &init_attr);
        if (ret) {
                perror("ibv_query_qp");
                goto out_destroy_accept_ep;
        }
        if (init_attr.cap.max_inline_data >= 16)
                send_flags = IBV_SEND_INLINE;
        else
                printf("rdma_server: device doesn't support IBV_SEND_INLINE, "
                       "using sge sends\n");

        mr = rdma_reg_msgs(id, recv_msg, 16);
        if (!mr) {
                ret = -1;
                perror("rdma_reg_msgs for recv_msg");
                goto out_destroy_accept_ep;
        }
        if ((send_flags & IBV_SEND_INLINE) == 0) {
                send_mr = rdma_reg_msgs(id, send_msg, 16);
                if (!send_mr) {
                        ret = -1;
                        perror("rdma_reg_msgs for send_msg");
                        goto out_dereg_recv;
                }
        }

        ret = rdma_post_recv(id, NULL, recv_msg, 16, mr);
        if (ret) {
                perror("rdma_post_recv");
                goto out_dereg_send;
        }

        ret = rdma_accept(id, NULL);
        if (ret) {
                perror("rdma_accept");
                goto out_dereg_send;
        }

        while ((ret = rdma_get_recv_comp(id, &wc)) == 0);
        if (ret < 0) {
                perror("rdma_get_recv_comp");
                goto out_disconnect;
        }

        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");
        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_accept_ep:
        rdma_destroy_ep(id);
out_destroy_listen_ep:
        rdma_destroy_ep(listen_id);
out_free_addrinfo:
        rdma_freeaddrinfo(res);
        return ret;
}

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

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

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

论坛徽章:
9
程序设计版块每日发帖之星
日期:2015-10-18 06:20:00程序设计版块每日发帖之星
日期:2015-11-01 06:20:00程序设计版块每日发帖之星
日期:2015-11-02 06:20:00每日论坛发贴之星
日期:2015-11-02 06:20:00程序设计版块每日发帖之星
日期:2015-11-03 06:20:00程序设计版块每日发帖之星
日期:2015-11-04 06:20:00程序设计版块每日发帖之星
日期:2015-11-06 06:20:00数据库技术版块每周发帖之星
日期:2015-12-02 15:02:47数据库技术版块每日发帖之星
日期:2015-12-08 06:20:00
发表于 2016-12-08 19:56 |显示全部楼层
安装范例库  sudo apt install librdmacm1
您需要登录后才可以回帖 登录 | 注册

本版积分规则

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号 北京市公安局海淀分局网监中心备案编号:11010802020122
广播电视节目制作经营许可证(京) 字第1234号 中国互联网协会会员  联系我们:wangnan@it168.com
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP