2008-09-19 106 views
0

我正在使用gsoap在C++中創建soap服務器。消息通過用Java編寫的總線進行路由。服務器和總線都是多線程的。一切正常,通過系統一次發送一條消息。如果我啓動3個客戶端,每個客戶端都儘可能快地發送消息,那麼對於大約3500條消息,一切正常。然後我開始定期收到「一次只允許一個套接字連接」。來自gsoap代碼的錯誤。典型的約4000條消息中有3950條通過OK。在過去的500次發送中發生全部50次故障。C++中的Gsoap錯誤

  1. 爲什麼這些錯誤會在多次發送後發生,但不會在發送開始時發生?發送率不會增加。

  2. 這是什麼意思?我無法找到有關錯誤的任何解釋,其含義對我而言並不明確。

  3. 任何人都成功地多線程gsoap應用程序?

這是我的服務器代碼。

long WINAPI threadGO(soap *x); 

int main(int argc, char* argv[]) 
{ 
HANDLE thread1; 
int m, s; /* master and slave sockets */ 
struct soap *soap = soap_new(); 
if (argc < 2) 
soap_serve(soap); /* serve as CGI application */ 
else 
{ 
    m = soap_bind(soap, NULL, atoi(argv[1]), 100); 
    if (m < 0) 
    { 
     soap_print_fault(soap, stderr); 
     exit(-1); 
    } 
    fprintf(stderr, "Socket connection successful: master socket = %d\n", m); 
    for (;;) 
    { 
    s = soap_accept(soap); 
    thread1 = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)threadGO,soap_copy(soap),0,NULL); 
    } 
} 
soap_done(soap); 
free(soap); 
return 0; 
} 

long WINAPI threadGO(soap *x) 
{ 
soap_serve(x); 
soap_end(x); 
return 0 

; 
} 

回答

1

我相信你已經有了在threadGO資源泄漏。

soap_copy()複製肥皂結構後,我相信它需要通過調用所有的被釋放:

soap_destroy(x); 
soap_end(x); 
soap_free(x); 

具體來說,要soap_done()缺少的調用(這是從soap_free()調用)調用soap_closesock(),其中關閉插座。