我們正在開發一個應用程序,在該應用程序中我們使用基於WinSock的sime套接字方法與外部模塊進行通信。我們的要求是確保連接始終處於打開狀態,因此,每當我們斷開連接時,我們會不斷重試每1分鐘連接一次。追蹤WinSock MFC應用程序中句柄泄漏的來源
我們的問題從這裏開始。我們已經注意到在套接字重新連接的每次重試時,它正好泄漏兩個Windows句柄。我們嘗試了很多選擇,但都沒有工作。哪些手柄可能會泄漏,我們如何才能確定罪魁禍首?
下面是我們使用的是現在的代碼:
bool CSocketClass::ConnectToServer(int nLineNo)
{
string strIPAddress;
int nPortNo;
SOCKET* l_ClientSocket;
int ConnectionResult;
//----------------------
// Create a SOCKET for connecting to server
if (nLineNo == 1)
{
m_objLine1.m_ClientSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
strIPAddress = m_objLine1.m_strIPAddress;
nPortNo = m_objLine1.m_nPortNo;
l_ClientSocket = &(m_objLine1.m_ClientSocket);
}
else
{
m_objLine2.m_ClientSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
strIPAddress = m_objLine2.m_strIPAddress;
nPortNo = m_objLine2.m_nPortNo;
l_ClientSocket = &(m_objLine2.m_ClientSocket);
}
if(INVALID_SOCKET == *l_ClientSocket)
{
return false;
}
//----------------------
// The sockaddr_in structure specifies the address family,
// IP address, and port of the server to be connected to.
sockaddr_in clientService;
clientService.sin_family = AF_INET;
clientService.sin_addr.s_addr = inet_addr(strIPAddress.c_str());
clientService.sin_port = htons(nPortNo);
//----------------------
// Connect to server.
ConnectionResult = connect(*l_ClientSocket, (SOCKADDR*) &clientService, sizeof(clientService)) ; if (ConnectionResult == SOCKET_ERROR)
{
if (nLineNo == 1)
{
//ERROR in line1
}
else
{
//ERROR in line2
}
return false;
}
else
//In case of successful connection
{
//Other actions
}
return true;
}
您的泄漏不在發佈的代碼中。作爲一個方面說明,不要'closesocket(INVALID_SOCKET)' - 這是毫無意義的,最壞的情況是有害的。 – Erik 2011-04-14 12:58:29
最初,我們只是關閉套接字,只是它的連接,但即使這不是解決我們的目的..你確定泄漏不在這個代碼?因爲我從字面上看過(在調試時)連接語句後,我的代碼完全泄露了2個句柄。爲了確保我說的是windows處理泄漏,我們可以在任務管理器中看到,我不是在談論內存泄漏。 – vrajs5 2011-04-14 13:50:19
@ vrajs5:當你完成這些套接字時,你並沒有關閉這些套接字。當你連接時,這不是泄漏 - 當你忘記清理時它會變成泄漏。 – Erik 2011-04-14 13:55:27