背景:基于Qt和C实现web service 服务
网上大多数都是在linux环境下创建的,将最近代码贴上 供参考,使用gsoap版本为2.8.6 win7环境 qt4.8.1 创建的是QTConsole工程。
一、服务端编译步骤
参考http://blog.csdn.net/testcs_dn/article/details/51463367
我的头文件编写如下 data_trans_svr.h
//gsoap ns service name: data_trans
//gsoap ns service namespace: http://localhost:40004/data_trans.wsdl
//gsoap ns service location: http://localhost:40004
//gsoap ns service executable: data_trans.cgi
//gsoap ns service encoding: encoded
//gsoap ns schema namespace: urn:data_trans
typedef std::string xsd__string;
int ns__Login(char* usr, char *password, char * param, bool &is_login);
int ns__DownloadConf(char** dev_info);
int ns__ReadData(xsd__string& data);
实现文件如下: (main.cpp)
#include <QtCore/QCoreApplication>
#include "stdafx.h"
#include "soapH.h"
#include <windows.h>
#include <QTextCodec>
#include "data_trans.nsmap"
// 宏定义
#define BACKLOG 100 /* Max. request backlog */
#define MAX_THREAD 5 // 最大线程数
#define MAX_QUEUE 1000 // 最大队列长度
// 全局变量定义
SRWLOCK g_lock;
CONDITION_VARIABLE g_ConditionVar;
SOAP_SOCKET queue[MAX_QUEUE]; //数组队列
int head =0, tail =0; //队列头队列尾初始化
// 全局函数
void * process_queue(void *); //线程入口函数
int enqueue(SOAP_SOCKET); //入队列函数
SOAP_SOCKET dequeue(void); //出队列函数
int http_get(struct soap * soap);
//线程入口函数
void * process_queue(void * soap)
{
struct soap * tsoap = (struct soap *)soap;
for(;;)
{
tsoap->socket = dequeue();
if (!soap_valid_socket(tsoap->socket))
{
break;
}
soap_serve(tsoap);
soap_destroy(tsoap);
soap_end(tsoap);
}
return NULL;
}
//入队列操作
int enqueue(SOAP_SOCKET sock)
{
int status = SOAP_OK;
int next;
AcquireSRWLockExclusive(&g_lock); //获得SRW锁
next = tail +1;
if (next >= MAX_QUEUE)
next = 0;
if (next == head)
status = SOAP_EOM;
else
{
queue[tail] =sock;
tail = next;
}