首页 文章

gSOAP C多线程独立服务器和客户端示例

提问于
浏览
0

我是gSOAP的新手,有些人可以发布一个有效的gSOAP多线程c独立服务器和客户端 . 在gSOAP文档中,多线程独立服务器没有关于调用webservice函数的位置的详细信息,比如int ns_add(int a,int b),没有调用主文件中的头文件calc.h中定义的函数服务器类 - calc.cpp .

请一步一步指导,这将有助于像我这样的新人 .

您的回复将不胜感激 .

2 回答

  • 1

    这是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

  • 1

    您可以在系统上找到gsoap的许多示例,其中已经安装了gsoap . 您将在安装文件夹中找到 SAMPLE 文件夹,以帮助您了解gSoap的不同应用程序 .

相关问题