我是gSOAP的新手,有些人可以发布一个有效的gSOAP多线程c独立服务器和客户端 . 在gSOAP文档中,多线程独立服务器没有关于调用webservice函数的位置的详细信息,比如int ns_add(int a,int b),没有调用主文件中的头文件calc.h中定义的函数服务器类 - calc.cpp .
请一步一步指导,这将有助于像我这样的新人 .
您的回复将不胜感激 .
这是c中gsoap的一个例子:在头文件中我们有例如这个函数(服务):
int yb__add_list(char *name, char *tel, char **result); int yb__del_list(int no, char **result); int yb__get_tel_by_name(char *name, char **result); int yb__get_name_by_tel(char *tel, char **result); int yb__get_list(char **result);
通过运行soapcpp2 interface.h生成我们的存根之后我们有一些文件,检查文档以了解它:soapStub.h,soapH.h,soapC.c,soapClient.c,soapServer.c然后我们可以实现这样的服务:
int main(int argc, char **argv) { int m, s; /* master and slave sockets */ struct soap soap; soap_init(&soap); load_list(); show_list(); if (argc < 2) soap_serve(&soap); /* serve as CGI application */ else { m = soap_bind(&soap, NULL, atoi(argv[1]), 100); if (m < 0) { soap_print_fault(&soap, stderr); exit(-1); } fprintf(stderr, "Socket connection successful: master socket = %d\n", m); for ( ; ; ) { s = soap_accept(&soap); fprintf(stderr, "Socket connection successful: slave socket = %d\n", s); if (s < 0) { soap_print_fault(&soap, stderr); exit(1); } soap_serve(&soap); soap_end(&soap); } } return 0; } int yb__add_list(struct soap *soap, char *name, char *tel, char **result) { printf("the name is %s, tel is %s\n", name, tel); *result = (char *) soap_malloc(soap, 50); if(add_list(name, tel) > 0) strcpy(*result, "Success!"); else strcpy(*result, "Failed!"); show_list(); save_list(); return SOAP_OK; } int yb__del_list(struct soap *soap, int no, char **result) { *result = (char *) soap_malloc(soap, 50); if(delete_list(no) > 0) strcpy(*result, "Success!"); else strcpy(*result, "Failed!"); save_list(); return SOAP_OK; } int yb__get_tel_by_name(struct soap *soap, char *name, char **result) { char tel[50]; *result = (char *) soap_malloc(soap, 200); if(get_tel_by_name(name, tel ) == 1) sprintf(*result, "The tel of %s is: \n%s\nSuccess!", name, tel); else strcpy(*result, "Failed!"); return SOAP_OK; } int yb__get_name_by_tel(struct soap *soap, char *tel, char **result) { char name[50]; *result = (char *) soap_malloc(soap, 200); if(get_name_by_tel(tel, name) == 1) sprintf(*result, "The owner of %s is: \n%s\nSuccess!", tel, name); else strcpy(*result, "Failed!"); return SOAP_OK; } int yb__get_list(struct soap *soap, char **result) { *result = (char *)malloc(1024); get_list(*result); return SOAP_OK; }
您可以在终端./server端口中执行您的服务作为单独的沙子服务器然后在客户端:
const char server[] = "localhost:8080/"; int executecmd(char *inbuf, struct soap *p_soap); int main(void) { struct soap soap; char inbuf[MAX_CANON]; int ret; soap_init(&soap); for( ; ; ) { fputs(NEWLINE_STRING, stdout); fputs(CLIENT_PROMPT_STRING, stdout); if (fgets(inbuf, MAX_CANON, stdin) == NULL) break; if (*(inbuf + strlen(inbuf) - 1) == NEWLINE_SYMBOL) *(inbuf + strlen(inbuf) - 1) = 0; if(is_blank_line(inbuf)) continue; if((ret = executecmd(inbuf, &soap)) < 0) break; /* accept the quit command */ else if(ret == 0) continue; /* encount the error command */ } return 1; } int executecmd(char *inbuf, struct soap *p_soap) { char *result; int n; char **chargv; if((n = makeargv(inbuf, BLANK_STRING, &chargv)) < 0){ printf("makeargv error\n"); exit(0); } if(!strcmp(chargv[0], "add") && n == 3){ soap_call_yb__add_list(p_soap, server, "", chargv[1], chargv[2], &result); printf("%s\n", result); return 0; } else if(!strcmp(chargv[0], "del") && n == 2 ){ soap_call_yb__del_list(p_soap, server, "", atoi(chargv[1]), &result); printf("%s\n", result); return 0; } else if(!strcmp(chargv[0], "gettel") && n == 2){ soap_call_yb__get_tel_by_name(p_soap, server, "", chargv[1], &result); printf("%s\n", result); return 0; } else if(!strcmp(chargv[0], "getname") && n == 2){ soap_call_yb__get_name_by_tel(p_soap, server, "", chargv[1], &result); printf("%s\n", result); return 0; } else if(!strcmp(chargv[0], "list")){ soap_call_yb__get_list(p_soap, server, "", &result); printf("%s\n", result); return 0; } else if(!strcmp(chargv[0], QUIT_STRING)){ return -1; } else if(!strcmp(chargv[0], HELP_STRING)){ printf("The usage of the command:\n"); printf("\"add name tel\" add new entry to address book.\n"); printf("\"del no\" delete entry by its corresponding phone number.\n"); printf("\"getname tel\" get name by the corresponding phone number.\n"); printf("\"gettel name\" get phone number by name.\n"); printf("\"list\" list the current entries in the address book.\n"); printf("\"help\" get help.\n"); printf("\"quit\" quit this client.\n"); return 0; } else{ printf("Can not execute this command.\n input \"help\" to get usage of commands."); return 0; } return 1; }
您也可以在终端中运行客户端:./ client
您可以在系统上找到gsoap的许多示例,其中已经安装了gsoap . 您将在安装文件夹中找到 SAMPLE 文件夹,以帮助您了解gSoap的不同应用程序 .
2 回答
这是c中gsoap的一个例子:在头文件中我们有例如这个函数(服务):
通过运行soapcpp2 interface.h生成我们的存根之后我们有一些文件,检查文档以了解它:soapStub.h,soapH.h,soapC.c,soapClient.c,soapServer.c然后我们可以实现这样的服务:
您可以在终端./server端口中执行您的服务作为单独的沙子服务器然后在客户端:
您也可以在终端中运行客户端:./ client
您可以在系统上找到gsoap的许多示例,其中已经安装了gsoap . 您将在安装文件夹中找到 SAMPLE 文件夹,以帮助您了解gSoap的不同应用程序 .