#include "soapH.h"

#include "wsddapi.h"

#include <stdio.h>

#include <sys/types.h> /* See NOTES */

#include <sys/socket.h>

#include <unistd.h>

#include <errno.h>


extern int GetListenPort();

void* main_probe(void* arg)

{

int m, s;

struct ip_mreq mcast;

struct soap soap;

soap_init2(&soap, SOAP_IO_UDP | SOAP_IO_FLUSH, SOAP_IO_UDP|SOAP_IO_FLUSH);

soap_set_namespaces(&soap, namespaces);

soap_set_mode(&soap, SOAP_C_UTFSTRING);//客户端接收支持中文

soap.bind_flags = SO_REUSEADDR;

soap.connect_timeout = 10;

soap.recv_timeout = 5;

soap.send_timeout = 5;

soap_register_plugin(&soap, soap_wsa);

// 打开调试信息,需 1)、首先gsoap安装时,在./configure --prefix=/usr/local/gsoap --enable-debug

//2)、在/usr/local/gsoap/include/sdtsoap2.h文件中开启#define DEBUG

//soap_set_recv_logfile(&soap, "./log/recv.xml");

//soap_set_sent_logfile(&soap, "./log/send.xml");

//soap_set_test_logfile(&soap, "./log/test.log");

if(!soap_valid_socket(soap_bind(&soap, NULL, 3702, 16)))

{

soap_print_fault(&soap, stderr);

exit(1);

}

mcast.imr_multiaddr.s_addr = inet_addr("239.255.255.250");

mcast.imr_interface.s_addr = inet_addr("0.0.0.0");

if(setsockopt(soap.master, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char*)&mcast, sizeof(mcast)) < 0)

{

printf("setsockopt error!\n");

return 0;

}

//成功绑定之后,便开始监听

for (;;) {

//监听直到有连接请求

soap_wsdd_listen(&soap, 0);

soap_destroy(&soap);

soap_end(&soap);

fprintf(stderr, "Socket connection successful: slave socket = %d\n", s);

}

soap_done(&soap);

return (void*)0;

}


int http_get(struct soap *soap)

{

/*

The callback is required to produce a response to the request in textual form, such as a

Web page or a SOAP/XML response. This method does not work with CGI.

*/


{

soap->http_content = "text/xml"; //HTTP header with text /xml content

char szContent[100] = {0};


sprintf(szContent, "welcome to use webservice!");


sprintf(soap->tmpbuf, szContent);


soap_send_raw(soap, soap->tmpbuf, strlen(szContent));

}


soap_end_send(soap);


return SOAP_OK;


}

int main(int argc, char **argv)

{

int m, s;

struct soap thesoap;

pthread_t thrProbe;

pthread_create(&thrProbe,NULL,main_probe,NULL);

soap_init(&thesoap);

soap_set_namespaces(&thesoap, namespaces);

#ifdef DEBUG

printf("debug mode\n");

#else

printf("release mode\n");

#endif

thesoap.fget = http_get;


if (argc < 0) {

printf("usage: %s <server_port> \n", argv[0]);

exit(1);

} else {

// LOAD_CFGFILE(root);

int port = GetListenPort();//8085;//root["port"].asInt();

m = soap_bind(&thesoap, NULL, port, 100);

if (m < 0) {

soap_print_fault(&thesoap, stderr);

exit(-1);

}

fprintf(stderr, "Socket connection successful: master socket = %d\n", m);

for (;;) {

s = soap_accept(&thesoap);

if (s < 0) {

soap_print_fault(&thesoap, stderr);

exit(-1);

}

// fprintf(stderr, "Socket connection successful: slave socket = %d\n", s);

soap_serve(&thesoap);

soap_end(&thesoap);

// fprintf(stderr, "soap_end socket = %d\n", s);

}

}

return 0;

}