Хобрук: Ваш путь к мастерству в программировании

gSOAP C++ Многопоточный автономный сервер и пример клиента

Я новичок в gSOAP, может ли кто-нибудь опубликовать рабочий многопоточный автономный сервер и клиент gSOAP на С++. в документе gSOAP многопоточный автономный сервер не содержит сведений о том, где вызывать функции веб-службы, например, int ns_add(int a, int b), нет вызова функций, определенных в заголовочном файле calc.h в основном класс сервера - calc.cpp.

Пожалуйста, дайте пошаговую инструкцию, которая поможет таким новичкам, как я.

Ваш ответ будет оценен.

30.09.2012

  • См. эту ссылку для примера многопоточного сервера C++: 8150380/gsoap-многопоточность/. Если вам нужны лучшие ответы, вам нужно поработать самостоятельно, какой код вы пробовали? Почему бы не начать создавать такие инструкции самостоятельно? 02.10.2012
  • Привет, я попробовал ссылку, которую вы прислали, но в ней не упоминается, как ns_add, ns__mul обслуживаются из void *process_request(void *calc). поэтому разместил этот вопрос. создать пример самостоятельно - тоже хороший вариант, я попробую 03.10.2012

Ответы:


1

Это пример 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

02.01.2014

2

Вы можете найти много примеров gsoap, где вы установили gsoap в своей системе. В папке установки вы найдете папку SAMPLE, которая поможет вам понять различные приложения gSoap.

27.01.2014
Новые материалы

Создание кнопочного меню с использованием HTML, CSS и JavaScript
Вы будете создавать кнопочное меню, которое имеет состояние наведения, а также позволяет вам выбирать кнопку при нажатии на нее. Финальный проект можно увидеть в этом Codepen . Шаг 1..

Внедрите OAuth в свои веб-приложения для повышения безопасности
OAuth — это широко распространенный стандарт авторизации, который позволяет приложениям получать доступ к ресурсам от имени пользователя, не раскрывая его пароль. Это позволяет пользователям..

Классы в JavaScript
class является образцом java Script Object. Конструкция «class» позволяет определять классы на основе прототипов с чистым, красивым синтаксисом. // define class Human class Human {..

Как свинг-трейдеры могут использовать ИИ для больших выигрышей
По мере того как все больше и больше профессиональных трейдеров и активных розничных трейдеров узнают о возможностях, которые предоставляет искусственный интеллект и машинное обучение для улучшения..

Как построить любой стол
Я разработчик программного обеспечения. Я люблю делать вещи и всегда любил. Для меня программирование всегда было способом создавать вещи, используя только компьютер и мое воображение...

Обзор: Машинное обучение: классификация
Только что закончил третий курс курса 4 часть специализации по машинному обучению . Как и второй курс, он был посвящен низкоуровневой работе алгоритмов машинного обучения. Что касается..

Разработка расширений Qlik Sense с qExt
Использование современных инструментов веб-разработки для разработки крутых расширений Вы когда-нибудь хотели кнопку для установки переменной в приложении Qlik Sense? Когда-нибудь просили..