[英]Writing a C++ SOAP (multithreaded) client application - without gSOAP
[英]gSOAP C++ Multithreaded standalone server and client example
我是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 + Port中執行你的服務作為沙子服務器然后在客戶端:
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的不同應用程序。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.