gpt4 book ai didi

c++ - gSOAP 链接 C++ 服务器类以接受同一端口上的消息不起作用

转载 作者:IT王子 更新时间:2023-10-29 00:37:54 25 4
gpt4 key购买 nike

我们在同一个项目中编译了 6 个 WSDL,由于硬件的一些限制,我们只能打开一个端口进行监听。

为此,我们选择本 gSOAP Manual7.2.8 如何链接 C++ 服务器类以在同一端口上接受消息 章节中描述的方法。 .

但是,当我们在使用这种方法时遇到许多严重的问题:

<强>1。如果有很多请求并发到达,那么有时soap_begin_serve报错error=-1,socket建立后立即被soap server关闭

<强>2。如果我们在 soap_free_stream() 之后调用 xxx.destory(),那么 soap_accept() 将报告错误的文件描述符错误并且不再工作(已解决)

有谁知道出现以上现象的原因是什么?如何解决?
除了一些更改外,我们的代码与示例非常接近,请参见下面的部分。

//server thread 
Abc::soapABCService server; // generated with soapcpp2 -i -x -n -QAbc

server.bind(NULL, 12345, 100);
server.soap_mode = SOAP_KEEP_ALIVE | SOAP_UTF_CSTRING;
server.recv_timeout = server.send_timeout = 60;

while (true)
{
server.accept();

...
pthread_create(&pid, NULL, handle_new_request, server.copy());
} // while(true)



// work thread - the thread function
void *handle_new_request(void* arg)
{
// generated with soapcpp2 -i -x -n -QAbc
Abc::soapABCService *abc = (Abc::soapABCService*)arg;
Uvw::soapUVWService uvw; // generated with soapcpp2 -i -x -n -QUvw
Xyz::soapXYZService xyz; // generated with soapcpp2 -i -x -n -QXyz

if(soap_begin_serve(abc))
{
//sometimes it reports error
//due to unkown reason, socket was closed by soap server
abc->soap_stream_fault(std::cerr);
}
else if (abc->dispatch() == SOAP_NO_METHOD)
{
soap_copy_stream(&uvw, abc);
uww.state = SOAP_COPY;

if (uvw.dispatch() == SOAP_NO_METHOD)
{
soap_copy_stream(&xyz, &uvw);
xyz.state = SOAP_COPY;

if (xyz.dispatch())
{
soap_send_fault(&xyz); // send fault to client
xyz.soap_stream_fault(std::cerr);
}

soap_free_stream(&xyz); // free the copy
xyz.destroy();
}
else
{
soap_send_fault(&uvw); // send fault to client
uvw.soap_stream_fault(std::cerr);
}

soap_free_stream(&uvw); // free the copy
uvw.destroy();
}
else if (abc->error)
{
abc->soap_stream_fault(std::cerr);
}
else
{

}

abc->destroy();
delete abc;
abc = NULL;
}

最佳答案

终于找到了一些连接刚建立就被服务器关闭的原因。

这不是 gSOAP 服务器的错,这是因为所有连接都来自同一台机器,这些客户端被设置为重用地址和端口重用导致了这个问题。

关于c++ - gSOAP 链接 C++ 服务器类以接受同一端口上的消息不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31488836/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com