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 服务器的错,这是因为所有连接都来自同一台机器,这些客户端设置为重用地址和端口重用导致了这个问题。