mdsplus之通过C和C++远程访问
来源:互联网 发布:linux vim 删除 编辑:程序博客网 时间:2024/06/07 06:13
本文转自: http://blog.csdn.net/xhu_eternalcc/article/details/15378061
首先当然需要将远程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里面配置),且任意配置不受影响,代码如下:
-
- #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);
- if(-1==socket){
- fprintf(stderr,"Error connecting to mdsip server.\n");
-
- }
- 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;
- }
- 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;
- }
- return retSize;
- }
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;
- }
- return 0;
- }
二、C++语言中的远程访问mdsplus
1.类似于在C程序中先connect服务器,再open打开相应树:
-
- #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中配置相应树的环境变量,代码如下:
-
- #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服务器上的树。