2010-10-08 50 views
2

我有一個gSoap的問題 - 它沒有關閉插座..這裏的情況是:應用程序工作正常,但當我打電話「重新加載」功能時,它不能重新連接..這是一段代碼:gSOAP會不會**關閉套接字?

soap_destroy(&m_soapObj); 
soap_end(&m_soapObj); 
soap_done(&m_soapObj); 

sleep(1); 

soap_init(&m_soapObj); 

//m_ptrThis should be initialized already 
assert(m_ptrThis != NULL); 
m_soapObj.user = &m_ptrThis; 

m_soapObj.accept_timeout = nAcceptTimeout; 
m_ptrThreadPool->SetNumThreads(nNumThreads); 
m_nSocketListener = soap_bind(&m_soapObj, NULL, nPort, nBacklog); 
if (!soap_valid_socket(m_nSocketListener)) 
{ 
    throw Exception(
    "Cannot start listening on port: %d", nPort);   
} 

它拋出..當我嘗試使用soap_free時,程序崩潰,因爲我不創建新的Soap對象,只是再次初始化它。所以,soap_done應該可以工作。有趣的是,這不是而是每次都會發生。

這是非常奇怪..和緊迫:/

在此先感謝了很多

編輯的問題就解決了。非常感謝Duck!

+1

它正在拋出什麼錯誤?看起來好像你可以使用soap.errnum和soap_print_fault()來查找。你事先關閉了套接字嗎?你沒有使用SO_REUSEADDR並重新啓動太快? – Duck 2010-10-08 17:44:20

+0

嗨,我之前在這裏寫過,但是發生了一些事情,可能是因爲該網站已經關閉..無論如何..非常感謝!這工作!我添加了SO_REUSEADDR,一切正常..這是一個虛假的錯誤,但我根本不熟悉這個gSoap庫..只能修復應用程序中的錯誤,從其他人那裏寫出來......很難修復這樣的錯誤立即出現問題,當你沒有時間閱讀任何這樣的第三方圖書館的東西。非常感謝你的幫助! – 2010-10-09 20:06:18

+0

我試過soap_print_fault,它'說'只是無法重新打開套接字。這位撰寫此應用程序的開發人員已將「等待(1);」在soap_done之後,但它根本不夠。而且該應用程序每秒處理大約500-800個請求,所以我不能再設置更長的等待時間。所以,我的意思是,問題真的在那個時候,因爲如果我等待,比方說,30秒,套接字已成功重新打開。無論如何,再次感謝您的幫助! – 2010-10-09 20:11:06

回答

2

你應該知道究竟是什麼錯誤被拋出。

您可能會從bind()獲得「Address Already in Use」錯誤。你可以嘗試通過使用setsockopt()或者等效的soap調用來修正SO_REUSEADDR選項。

This鏈接提供了一個簡明的解釋。

+0

..謝謝!(= .. – 2010-12-07 20:43:48