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里面配置),且任意配置不受影响,代码如下:

[cpp] view plain copy
 print?
  1. //mdsplus_read.c  
  2. #include<mdslib.h>  
  3. #include<mdsshr.h>  
  4. #include<stdio.h>  
  5. #include<string.h>  
  6. #define statusOk(status) ((status)&1)  
  7. int getSize(char*sigName);  
  8. int main(int argc,char** argv){  
  9.     int socket=-1;  
  10.     int status=-1;  
  11.     int shot=90000;  
  12.     char tName[]="eastpower";  
  13.     char ip[]="202.127.204.220:8000";  
  14.     int size=0;  
  15.     socket=MdsConnect(ip);//:8001");  
  16.     if(-1==socket){  
  17.         fprintf(stderr,"Error connecting to mdsip server.\n");  
  18. //      return -1;  
  19.     }  
  20.     status=MdsOpen(tName,&shot);  
  21.     if(!statusOk(status)){  
  22.         fprintf(stderr,"Error opening tree for shot %d:%s.\n",shot,MdsGetMsg(status));  
  23.         return -1;  
  24.     }else{  
  25.         fprintf(stderr,"opening tree for shot %d:%s Successful.\n",shot,MdsGetMsg(status));  
  26.     }//  
  27.     size=getSize("f010_S");  
  28.     printf("size=%d\n",size);  
  29.     if(size<1){  
  30.         fprintf(stderr,"Error retrieving length of signal\n");  
  31.         return -1;  
  32.     }//if  
  33.     return 0;  
  34. }  
  35. int getSize(char*sigName){  
  36.     int dtypelong=DTYPE_LONG;  
  37.     int retSize;  
  38.     int lenDescr;  
  39.     int null=0;  
  40.     int status;  
  41.     int effNum=0;  
  42.     char expression[1024];  
  43.     sprintf(expression,"SIZE(%s)",sigName);  
  44.     lenDescr=descr(&dtypelong,&retSize,&null);  
  45.     status=MdsValue(expression,&lenDescr,&null,&effNum);  
  46.     if(!statusOk(status)){  
  47.         fprintf(stderr,"Error getting the size of %s.\n",sigName);  
  48.         return -1;  
  49.     }//if  
  50.     return retSize;  
  51. }//getSize()  

Makefile如下:

[cpp] view plain copy
 print?
  1. cc=gcc  
  2. mdsplus_read:mdsplus_read.o  
  3.         cc mdsplus_read.o -L/usr/local/mdsplus/lib -lMdsLib -lMdsShr -lc -o mdsplus_read -std=c99  
  4. mdsplus_read.o:mdsplus_read.c  
  5.         cc -c mdsplus_read.c -o mdsplus_read.o -I/usr/local/mdsplus/include -std=c99  

2.通过在本地envsyms中配置相应树的环境变量(修改了这个配置文件记得重新打开下终端加载环境变量),但是这种情况下,我只对8000端口测试成功,并且需要在envsyms省略不写8000端口,如下面:

[cpp] view plain copy
 print?
  1. eastpower_path 202.127.204.220::/var/ftp/pub/easttest  
代码中不再需要connect远程mdsplus服务器,可以像访问本地mdsplus一样,如下只给出了main函数,其他同上:

[cpp] view plain copy
 print?
  1. int main(int argc,char** argv){  
  2.         int status=-1;  
  3.         int shot=90000;  
  4.         char tName[]="eastpower";  
  5.         int size;  
  6.         status=MdsOpen(tName,&shot);  
  7.         if(!statusOk(status)){  
  8.                 fprintf(stderr,"Error opening tree for shot %d:%s.\n",shot,MdsGetMsg(status));  
  9.                 return -1;  
  10.         }else{  
  11.                 fprintf(stderr,"opening tree for shot %d:%s Successful.\n",shot,MdsGetMsg(status));  
  12.         }//  
  13.         size=getSize("f010_S");  
  14.         printf("size=%d\n",size);  
  15.         if(size<1){  
  16.                 fprintf(stderr,"Error retrieving length of signal\n");  
  17.                 return -1;  
  18.         }//if  
  19.         return 0;  
  20. }  


二、C++语言中的远程访问mdsplus

1.类似于在C程序中先connect服务器,再open打开相应树:

[cpp] view plain copy
 print?
  1. //mdsplus_c++_sample2.cpp  
  2. #include<mdsobjects.h>  
  3. #include<cstdlib>  
  4. #include<iostream>  
  5. #include<string>  
  6. inline char * convert(const std::string & str){  
  7.         return const_cast<char *> (str.c_str());  
  8. }  
  9. int main(int argc,char** argv){  
  10.         std::string  treeName("eastpower");  
  11.         std::string nodeName("F010_S");  
  12.         try{  
  13.                 MDSplus::Connection *conn = new MDSplus::Connection(convert("202.127.204.220"));  
  14.                 conn->openTree(convert(treeName),9000);  
  15.                 conn->closeTree(convert(treeName),9000);  
  16.         }catch(MDSplus::MdsException*exc){  
  17.                 std::cout<<"Error appending segments:"<<exc->what()<<std::endl;;  
  18.         }  
  19.         return EXIT_SUCCESS;  
  20. }  

Makefile如下:

[cpp] view plain copy
 print?
  1. cc=g++  
  2. mdsplus_c++_sample2:mdsplus_c++_sample2.o  
  3.         $(cc) mdsplus_c++_sample2.o -o mdsplus_c++_sample2 -L/usr/local/mdsplus/lib -lMdsObjectsCppShr  
  4. mdsplus_c++_sample2.o:mdsplus_c++_sample2.cpp  
  5.         $(cc) mdsplus_c++_sample2.cpp -c -o mdsplus_c++_sample2.o -I/usr/local/mdsplus/include -g  

 2.通过在本地envsyms中配置相应树的环境变量,代码如下:

[cpp] view plain copy
 print?
  1. //mdsplus_c++_sample2.cpp  
  2. #include<mdsobjects.h>  
  3. #include<cstdlib>  
  4. #include<iostream>  
  5. #include<string>  
  6. inline char * convert(const std::string & str){  
  7.         return const_cast<char *> (str.c_str());  
  8. }  
  9. int main(int argc,char** argv){  
  10.         std::string  treeName("eastpower");  
  11.         std::string nodeName("F010_S");  
  12.         try{  
  13.                 MDSplus::Tree * t= new MDSplus::Tree(convert(treeName),90000,convert("edit"));  
  14.                 MDSplus::TreeNode * node=t->getNode(convert(nodeName));  
  15.                 t->quit();  
  16.         }catch(MDSplus::MdsException*exc){  
  17.                 std::cout<<"Error appending segments:"<<exc->what()<<std::endl;;  
  18.         }  
  19.         return EXIT_SUCCESS;  
  20. }  


通过在本地envsyms中配置相应树的环境变量情况下,mdstcl和jScope工具都能像访问本地树一样打开远程mdsplus服务器上的树。