1、尝试安装softiWARP进行软件模拟RDMA传输,在没有硬件网卡的前提下进行实验。编译的时候遇到了问题。
直接编译会报错,“undefined reference to xxx”,意味着缺少链接库文件,所以加上-lrdmacm选项,但是依然报错。
根据提示,发现少了个libibverbs.so动态库的链接,所以再加上-libverbs即可。
2、编译成功,运行时出现segmentfault,仔细比对代码,发现是因为goto语句顺序有误。对于程序来说,如果某一时刻执行了goto语句,程序就会跳到对应的代码处顺序执行,在程序中,所有的goto语句都是顺序出现的,对应着不同的阶段,如果按照顺序放置goto语句,比如out_free_addrinfo,out_destroy_listen_ep,out_destroy_accept_ep,假如需要跳到out_free_addrinfo处,那么会继续向下执行,而此时并没有建立连接,所以out_destroy_accept_ep就是错误的。但是如果倒序放置,那么就不会报错,因为执行的goto语句对应的释放资源都是跳转之前已有的资源。这是一个小细节。也解决了之前的疑惑,为什么这些goto语句是倒序放置。
3、关于代码的几点疑惑
1)为什么最后的while循环中,if(ret<0)之后不再跳转了out_disconnect?
对于rdma_get_send_comp()和rdma_get_recv_comp()来说,成功返回0或1,失败返回-1。
第一个while中,如果ret=0,就一直循环,如果跳出,要么是1&#