最近在搞利用xmlrpc协议与java端通信,其好处就是可以跨平台通信java、c、PHP、c++都支持。首先需要去sourceforge网站去下载xmlrpc库安装在系统上,我用c实现了一个服务端,c服务端最主要的是这个函数xmlrpc_decompose_value,稍后讲解,以下是c服务端代码,java客户端没有贴:
static xmlrpc_value *
setRule(xmlrpc_env * const envP,
xmlrpc_value * const paramArrayP,
void * const usr_data)//方法对应的函数
{
xmlrpc_value *arrayP;
xmlrpc_value *retval;
char * getXmlString;
xmlrpc_decompose_value(envP, paramArrayP, "(s)", &getXmlString);//解析客户端传来的内容,其中第三个参数是格式,第四个参数是变量,格式可以为多个,参数也可以为多个。这里为"(s)",是以字符串解析,getXmlString(char *型)指向解析到的结果。如果为“(i)”,那么就是以int型解析,解析的结果(第四个参数)应该为int型变量。也可以是这种形式"(ii)"、"(is)",这说明解析的参数为两个,分别为int型和int型、int型和字符串型,后面的接受参数也应该为两个。"(A)"是以字符数组解析,“(S)”大写S是以结构体解析等等,具体解析格式可以参考xmlrpc函数手册,google之。
if(envP->fault_occurred)
return NULL;
else{
printf("getXmlString :%s\n",getXmlRule);
pthread_mutex_lock(&xml_parse_mutex);
parse_xml_string(getXmlString, strlen(getXmlString));//此函数忽略
pthread_mutex_unlock(&xml_parse_mutex);
}
free((void *)getXmlRule);
static void * XmlRpcListenThreadFunc(void *args)
{
xmlrpc_server_abyss(&env, &serverparm, XMLRPC_APSIZE(log_file_name));//c服务端
return NULL;
}
static void XmlRpcStartListenThread()
{
pthread_t xmlrpc_listen_thread;
pthread_create(&xmlrpc_listen_thread, NULL, (void*)XmlRpcListenThreadFunc, NULL);//创建线程
pthread_detach(xmlrpc_listen_thread);
}
<pre name="code" class="plain">int main(){
//struct xmlrpc_method_info3 const methodInfo = {
// "nprobe.setRule",
// &nprobe_setRule,
//};
xmlrpc_registry * registryP;
xmlrpc_env_init(&env);
xmlrpc_server_abyss_global_init(&env);
registryP = xmlrpc_registry_new(&env);
xmlrpc_registry_add_method(&env, registryP, NULL, "setRule",&setRule, NULL);//这里的"setRule"是客户端、服务端通信的方法名,类似于一种约定,setRule是方法对应的执行函数,一旦受到客户端的setRule方法,就会执行此函数。
serverparm.config_file_name = NULL;
serverparm.registryP = registryP;
serverparm.port_number = 9200;//端口
serverparm.log_file_name = NULL;
XmlRpcStartListenThread();//监听线程
<pre name="code" class="plain"> while(1){
sleep(2);
}
return 0;
}