gSOAP 链接 C++ 服务器 类 以接受同一端口上的消息不起作用
gSOAP Chaining C++ Server Classes to Accept Messages on the Same Port Not Working
我们在同一个项目中编译了六个WSDL,由于硬件的一些限制,我们只能打开一个端口进行监听。
为此,我们选择 7.2.8 如何链接 C++ 服务器 类 以在同一端口 中接受消息 gSOAP Manual.
但是,当我们在使用这种方法时遇到许多服务器问题:
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 服务器的错,这是因为所有连接都来自同一台机器,这些客户端设置为重用地址和端口重用导致了这个问题。
我们在同一个项目中编译了六个WSDL,由于硬件的一些限制,我们只能打开一个端口进行监听。
为此,我们选择 7.2.8 如何链接 C++ 服务器 类 以在同一端口 中接受消息 gSOAP Manual.
但是,当我们在使用这种方法时遇到许多服务器问题:
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 服务器的错,这是因为所有连接都来自同一台机器,这些客户端设置为重用地址和端口重用导致了这个问题。