首先当然需要将远程mdsplus服务器防火墙的相应端口开放,或者关闭防火墙。
说明,下面中本地IP为202.127.202.142
远程mdsplus服务器IP为202.127.204.220
eastpower树位于202.127.204.220
一、C语言中的远程访问mdsplus
1.在程序中先connect服务器,再open打开相应树,并且这种情况下在本地可以配置要打开tree的环境变量(export或在envsyms里面配置),且任意配置不受影响,代码如下:
//mdsplus_read.c
#include<mdslib.h>
#include<mdsshr.h>
#include<stdio.h>
#include<string.h>
#define statusOk(status) ((status)&1)
int getSize(char*sigName);
int main(int argc,char** argv){
int socket=-1;
int status=-1;
int shot=90000;
char tName[]="eastpower";
char ip[]="202.127.204.220:8000";
int size=0;
socket=MdsConnect(ip);//:8001");
if(-1==socket){
fprintf(stderr,"Error connecting to mdsip server.\n");
// return -1;
}
status=MdsOpen(tName,&shot);
if(!statusOk(status)){
fprintf(stderr,"Error opening tree for shot %d:%s.\n",shot,MdsGetMsg(status));
return -1;
}else{
fprintf(stderr,"opening tree for shot %d:%s Successful.\n",shot,MdsGetMsg(status));
}//
size=getSize("f010_S");
printf("size=%d\n",size);
if(size<1){
fprintf(stderr,"Error retrieving length of signal\n");
return -1;
}//if
return 0;
}
int getSize(char*sigName){
int dtypelong=DTYPE_LONG;
int retSize;
int lenDescr;
int null=0;
int status;
int effNum=0;
char expression[1024];
sprintf(expression,"SIZE(%s)",sigName);
lenDescr=descr(&dtypelong,&retSize,&null);
status=MdsValue(expression,&lenDescr,&null,&effNum);
if(!statusOk(status)){
fprintf(stderr,"Error getting the size of %s.\n",sigName);
return -1;
}//if
return retSize;
}//getSize()
Makefile如下:
cc=gcc
mdsplus_read:mdsplus_read.o
cc mdsplus_read.o -L/usr/local/mdsplus/lib -lMdsLib -lMdsShr -lc -o mdsplus_read -std=c99
mdsplus_read.o:mdsplus_read.c
cc -c mdsplus_read.c -o mdsplus_read.o -I/usr/local/mdsplus/include -std=c99
2.通过在本地envsyms中配置相应树的环境变量(修改了这个配置文件记得重新打开下终端加载环境变量),但是这种情况下,我只对8000端口测试成功,并且需要在envsyms省略不写8000端口,如下面:
eastpower_path 202.127.204.220::/var/ftp/pub/easttest
代码中不再需要connect远程mdsplus服务器,可以像访问本地mdsplus一样,如下只给出了main函数,其他同上:
int main(int argc,char** argv){
int status=-1;
int shot=90000;
char tName[]="eastpower";
int size;
status=MdsOpen(tName,&shot);
if(!statusOk(status)){
fprintf(stderr,"Error opening tree for shot %d:%s.\n",shot,MdsGetMsg(status));
return -1;
}else{
fprintf(stderr,"opening tree for shot %d:%s Successful.\n",shot,MdsGetMsg(status));
}//
size=getSize("f010_S");
printf("size=%d\n",size);
if(size<1){
fprintf(stderr,"Error retrieving length of signal\n");
return -1;
}//if
return 0;
}
二、C++语言中的远程访问mdsplus
1.类似于在C程序中先connect服务器,再open打开相应树:
//mdsplus_c++_sample2.cpp
#include<mdsobjects.h>
#include<cstdlib>
#include<iostream>
#include<string>
inline char * convert(const std::string & str){
return const_cast<char *> (str.c_str());
}
int main(int argc,char** argv){
std::string treeName("eastpower");
std::string nodeName("F010_S");
try{
MDSplus::Connection *conn = new MDSplus::Connection(convert("202.127.204.220"));
conn->openTree(convert(treeName),9000);
conn->closeTree(convert(treeName),9000);
}catch(MDSplus::MdsException*exc){
std::cout<<"Error appending segments:"<<exc->what()<<std::endl;;
}
return EXIT_SUCCESS;
}
Makefile如下:
cc=g++
mdsplus_c++_sample2:mdsplus_c++_sample2.o
$(cc) mdsplus_c++_sample2.o -o mdsplus_c++_sample2 -L/usr/local/mdsplus/lib -lMdsObjectsCppShr
mdsplus_c++_sample2.o:mdsplus_c++_sample2.cpp
$(cc) mdsplus_c++_sample2.cpp -c -o mdsplus_c++_sample2.o -I/usr/local/mdsplus/include -g
2.通过在本地envsyms中配置相应树的环境变量,代码如下:
//mdsplus_c++_sample2.cpp
#include<mdsobjects.h>
#include<cstdlib>
#include<iostream>
#include<string>
inline char * convert(const std::string & str){
return const_cast<char *> (str.c_str());
}
int main(int argc,char** argv){
std::string treeName("eastpower");
std::string nodeName("F010_S");
try{
MDSplus::Tree * t= new MDSplus::Tree(convert(treeName),90000,convert("edit"));
MDSplus::TreeNode * node=t->getNode(convert(nodeName));
t->quit();
}catch(MDSplus::MdsException*exc){
std::cout<<"Error appending segments:"<<exc->what()<<std::endl;;
}
return EXIT_SUCCESS;
}
通过在本地envsyms中配置相应树的环境变量情况下,mdstcl和jScope工具都能像访问本地树一样打开远程mdsplus服务器上的树。