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

标签 c++ linux multithreading gsoap

我们在同一个项目中编译了 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/

相关文章:

c++ - Fedora 等同于 prstat/truss

c++ - 在 C++ 中继续程序

C++ : Simultaneously calling more than one *. 可执行文件

linux - EXT2打开文件时检查ACL权限在哪里?

linux - 如何在不同类中编写lineEdit的connect语句

java - 结果集和语句未在 Java 中关闭的影响

python - 在 theano 中使用多处理

c++ - Visual Studio 2012 中的运行时不匹配

linux - GNU 与 Linux 有何关系?

C++ asio 提供线程的异步执行