请大侠们帮忙啊~有关MFC用gsoap 调用PHP的webservice

qq179082899 2012-03-01 05:27:26
具体操作就是 在一个线程中用gsoap调用webservice来验证账号密码是否正确,现在就有一个问题了,有用户在使用过成功会时不时出现调用接口没有返回值的情况,导致我线程卡死,无法正常安全结束,所以为了避免这种情况,我在外部设置了定时器,30s后线程还没结束的话,就直接 TerminateThread(m_loginThread->m_hThread,0)强制结束,但是很不安全,有时会Runtime Error

int result=wsPHP.checklogin(.....) ///卡在这里result一直得不到值

if(result== SOAP_OK)
{
......//操作成功,进行后面操作
}


web端会有个登陆日志,日志显示数据查询成功了,所以可以断定不是查询数据库有问题

还请大家帮帮忙,分析下问题出在那里。。。。实在让我头疼啊。。
...全文
351 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
zcpro 2012-07-11
  • 打赏
  • 举报
回复
楼主问题解决了吗,我也遇到了同样的问题。。
qq179082899 2012-03-07
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 onlycs 的回复:]

是否是多个线程同时使用同一个对象服务?如果是,请一个线程使用一个服务对象。因为多个线程可能会竞争资源,造成死锁。
[/Quote]
我自己写的是静态方法,但是库里面好像每个soap对象都有自己独立的空间,上面有部分代码,望指教
qq179082899 2012-03-07
  • 打赏
  • 举报
回复
为了清楚点,我剪了一段程序的代码,望大家多出出主意


声明:static int checklogin(char * account, char * service, char * psw);

int wsClient::checklogin(char * account, char * service, char * psw)
{
soapSOAPProxy wsPHP; /////这个是代理类
struct __ns1__checkloginResponse response;
......
int result=wsPHP.checklogin(base64_account,psw,base64_service,"", GetLocalSystemName(),1,response.checkloginResponse);//////卡在这里不返回

if(result== SOAP_OK)
{
return 1;
}
else
return 0;
}

///////////////////////下面是代理类的的接口

int soapSOAPProxy::checklogin(std::string account, std::string passwd, std::string servicename, std::string ip, std::string os, int softtype, std::string &checkloginResponse)
{
struct soap *soap = this;
struct __ns1__checklogin soap_tmp___ns1__checklogin;
struct __ns1__checkloginResponse *soap_tmp___ns1__checkloginResponse;
const char *soap_action = NULL;

std::string endpoint;
std::string action;

CSysConfig::SetSoapEndPoint(endpoint);
CSysConfig::SetSoapAction(action,"checklogin");

if(endpoint.length() < 1)
endpoint = "http://*****.com/soapserver";
if(action.length() < 1)
action = "http://*****/soap/checklogin";

soap->encodingStyle = NULL;
soap_tmp___ns1__checklogin.account =account;
soap_tmp___ns1__checklogin.passwd = passwd;
soap_tmp___ns1__checklogin.servicename = servicename;
soap_tmp___ns1__checklogin.ip = ip;
soap_tmp___ns1__checklogin.os = os;
soap_tmp___ns1__checklogin.softtype = softtype;

soap->connect_timeout=10;
soap->recv_timeout=10;
soap->send_timeout=10;
soap->accept_timeout=10;

soap_begin(soap);
soap_serializeheader(soap);
soap_serialize___ns1__checklogin(soap, &soap_tmp___ns1__checklogin);
if (soap_begin_count(soap))
return soap->error;
if (soap->mode & SOAP_IO_LENGTH)
{ if (soap_envelope_begin_out(soap)
|| soap_putheader(soap)
|| soap_body_begin_out(soap)
|| soap_put___ns1__checklogin(soap, &soap_tmp___ns1__checklogin, "-ns1:checklogin", NULL)
|| soap_body_end_out(soap)
|| soap_envelope_end_out(soap))
return soap->error;
}
if (soap_end_count(soap))
return soap->error;

if (soap_connect(soap, /*soap_endpoint*/endpoint.c_str(), /*soap_action*/action.c_str())
|| soap_envelope_begin_out(soap)
|| soap_putheader(soap)
|| soap_body_begin_out(soap)
|| soap_put___ns1__checklogin(soap, &soap_tmp___ns1__checklogin, "-ns1:checklogin", NULL)
|| soap_body_end_out(soap)
|| soap_envelope_end_out(soap)
|| soap_end_send(soap))
return soap_closesock(soap);
if (!&checkloginResponse)
return soap_closesock(soap);
soap_default_std__string(soap, &checkloginResponse);
if (soap_begin_recv(soap)
|| soap_envelope_begin_in(soap)
|| soap_recv_header(soap)
|| soap_body_begin_in(soap))
return soap_closesock(soap);
soap_tmp___ns1__checkloginResponse = soap_get___ns1__checkloginResponse(soap, NULL, "-ns1:checkloginResponse", "");
if (soap->error)
return soap_recv_fault(soap, 0);
if (soap_body_end_in(soap)
|| soap_envelope_end_in(soap)
|| soap_end_recv(soap))
return soap_closesock(soap);
checkloginResponse = soap_tmp___ns1__checkloginResponse->checkloginResponse;
return soap_closesock(soap);
}
onlycs 2012-03-07
  • 打赏
  • 举报
回复
是否是多个线程同时使用同一个对象服务?如果是,请一个线程使用一个服务对象。因为多个线程可能会竞争资源,造成死锁。
qq179082899 2012-03-07
  • 打赏
  • 举报
回复
同伴这几天请假,等他来了再详细问题为什么,但是我设置的有超时时间的
soap->connect_timeout=10;
soap->recv_timeout=10;
soap->send_timeout=10;

并且这些超时设置是成功的,我专门试了下,但是出现卡的情况时,貌似超时设置就失效了。。。PS:gsoap库版本2.8.1

[Quote=引用 9 楼 oyljerry 的回复:]

webService checklogin()接口设计有问题?出错,成功应该都会有返回
[/Quote]
qq179082899 2012-03-06
  • 打赏
  • 举报
回复
难道都没人遇到过这种情况?
oyljerry 2012-03-06
  • 打赏
  • 举报
回复
webService checklogin()接口设计有问题?出错,成功应该都会有返回
zgdqlc 2012-03-02
  • 打赏
  • 举报
回复
那就是gsoap调用webservice的问题了,这个不太了解
qq179082899 2012-03-02
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 ponder 的回复:]

那就把线程函数写成有返回值的,UINT ThreadProc(LPVOID pParam) ,正常情况return 1;非正常情况
return 0;
[/Quote]

朋友没听懂我意思啊。。我在线程里面调用的接口,通过判断这个接口的返回值来确定是否调用成功了,类似
UINT ThreadProc(LPVOID pParam)
{
BOOL result = 接口函数();//现在是这里的接口函数里面有问题,一直没返回值,这个接口函数是用 gsoap生成的

if(result)
{
//做正确的事情
}
return 0
}
zgdqlc 2012-03-02
  • 打赏
  • 举报
回复
那就把线程函数写成有返回值的,UINT ThreadProc(LPVOID pParam) ,正常情况return 1;非正常情况
return 0;
qq179082899 2012-03-02
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 ponder 的回复:]

30s后线程还没结束的话,不要TerminateThread(m_loginThread->m_hThread,0)强制结束,可以让线程自己结束
if(计时时间比较成功)
{
显示信息。。。;
return;
}
[/Quote]

怎么让线程自己结束。。我都得不到返回值。。换句话说调用这个接口成功还是失败我都不知道。。所以整个线程就停在调用那句,没办法让线程自己return
zgdqlc 2012-03-02
  • 打赏
  • 举报
回复
30s后线程还没结束的话,不要TerminateThread(m_loginThread->m_hThread,0)强制结束,可以让线程自己结束
if(计时时间比较成功)
{
显示信息。。。;
return;
}
lujunql 2012-03-01
  • 打赏
  • 举报
回复
你可以查查webservice中是怎么写的!

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧