Betere error handling WinSock
svn path=/Slnkdwf/trunk/; revision=26210
This commit is contained in:
@@ -225,8 +225,8 @@ STDMETHODIMP CCrypto::hotp(BSTR hexseed, LONGLONG moving_factor, BYTE digits, BS
|
||||
|
||||
ATLASSERT(sizeof(moving_factor) == 8);
|
||||
BYTE counter[sizeof(moving_factor)];
|
||||
for (int i = 0; i < sizeof (counter); i++)
|
||||
counter[i] = (BYTE)(moving_factor >> ((sizeof (moving_factor) - i - 1) * 8)) & 0xFF;
|
||||
for (int i = 0; i < sizeof (counter); i++)
|
||||
counter[i] = (BYTE)(moving_factor >> ((sizeof (moving_factor) - i - 1) * 8)) & 0xFF;
|
||||
|
||||
CHMAC_SHA1 HMAC_SHA1 ;
|
||||
HMAC_SHA1.HMAC_SHA1((BYTE *)(&counter), sizeof(counter), seed, sizeof(seed), digest) ;
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
#include "WinSock.h"
|
||||
|
||||
// Gebaseerd op http://www.binarytides.com/winsock-socket-programming-tutorial/
|
||||
// en op http://www.binarytides.com/category/programming/sockets/winsock-sockets/
|
||||
// CWinSock
|
||||
|
||||
STDMETHODIMP CWinSock::InterfaceSupportsErrorInfo(REFIID riid)
|
||||
@@ -21,6 +22,17 @@ STDMETHODIMP CWinSock::InterfaceSupportsErrorInfo(REFIID riid)
|
||||
return S_FALSE;
|
||||
}
|
||||
|
||||
CWinSock::CWinSock()
|
||||
{
|
||||
m_Timeout = 21000;
|
||||
}
|
||||
|
||||
CWinSock::~CWinSock()
|
||||
{
|
||||
if (m_must_close)
|
||||
ShutdownConnection();
|
||||
}
|
||||
|
||||
|
||||
STDMETHODIMP CWinSock::get_LocalHostIP(BSTR* pVal)
|
||||
{
|
||||
@@ -80,8 +92,7 @@ bool myconnect(SOCKET &sock, struct sockaddr_in &address, int timeout)
|
||||
int iResult = ioctlsocket(sock, FIONBIO, &iMode);
|
||||
if (iResult != NO_ERROR)
|
||||
{
|
||||
return false;
|
||||
//printf("ioctlsocket failed with error: %ld\n", iResult);
|
||||
throw myCString("ioctlsocket failed with error: %ld\n", iResult);
|
||||
}
|
||||
|
||||
if (!connect(sock, (struct sockaddr *)&address, sizeof(address)))
|
||||
@@ -94,8 +105,7 @@ bool myconnect(SOCKET &sock, struct sockaddr_in &address, int timeout)
|
||||
iResult = ioctlsocket(sock, FIONBIO, &iMode);
|
||||
if (iResult != NO_ERROR)
|
||||
{
|
||||
//printf("ioctlsocket failed with error: %ld\n", iResult);
|
||||
return false;
|
||||
throw myCString("ioctlsocket failed with error: %ld\n", iResult);
|
||||
}
|
||||
|
||||
fd_set Write, Err;
|
||||
@@ -105,7 +115,12 @@ bool myconnect(SOCKET &sock, struct sockaddr_in &address, int timeout)
|
||||
FD_SET(sock, &Err);
|
||||
|
||||
// check if the socket is ready
|
||||
select(0, NULL, &Write, &Err, &Timeout);
|
||||
iResult = select(0, NULL, &Write, &Err, &Timeout);
|
||||
if (iResult == SOCKET_ERROR)
|
||||
throw myCString("\nCWinSock: Could not connect %d", WSAGetLastError());
|
||||
if (iResult == 0)
|
||||
throw myCString("\nCWinSock: Timeout after %dms", timeout);
|
||||
|
||||
if (FD_ISSET(sock, &Write))
|
||||
{
|
||||
return true;
|
||||
@@ -131,9 +146,10 @@ STDMETHODIMP CWinSock::OpenConnection()
|
||||
{
|
||||
return myAtlReportError(GetObjectCLSID(), "\nCWinSock: Could not create socket : %d", WSAGetLastError());
|
||||
}
|
||||
m_must_close = true;
|
||||
|
||||
int nTimeout = m_Timeout; // 3 seconds
|
||||
setsockopt(m_socket, SOL_SOCKET, SO_SNDTIMEO, (const char*)&nTimeout, sizeof(int));
|
||||
int nTimeout = m_Timeout; // Milliseconde voor de send en receive (connect gaat apart)
|
||||
setsockopt(m_socket, SOL_SOCKET, SO_SNDTIMEO, (const char*)&nTimeout, sizeof(int));
|
||||
setsockopt(m_socket, SOL_SOCKET, SO_RCVTIMEO, (const char*)&nTimeout, sizeof(int));
|
||||
|
||||
InetPton(AF_INET, m_RemoteHostIP, &server.sin_addr.s_addr);
|
||||
@@ -141,12 +157,20 @@ STDMETHODIMP CWinSock::OpenConnection()
|
||||
server.sin_port = htons((u_short)(m_RemotePort));
|
||||
|
||||
// Connect to remote server
|
||||
// De gewone connect werkt ook wel maar als de andere kant niet reageert heb je een
|
||||
// timeout van 21 seconde die niet eenvoudig te overrulen is
|
||||
//if (connect(m_socket, (struct sockaddr *)&server, sizeof(server)) < 0)
|
||||
if (!myconnect(m_socket, server, m_Timeout))
|
||||
try
|
||||
{
|
||||
return myAtlReportError(GetObjectCLSID(), "\nCWinSock: Could not connect %d", WSAGetLastError());
|
||||
if (!myconnect(m_socket, server, m_Timeout))
|
||||
{
|
||||
return myAtlReportError(GetObjectCLSID(), "\nCWinSock: Could not connect %d", WSAGetLastError());
|
||||
}
|
||||
}
|
||||
catch (CString& e)
|
||||
{
|
||||
return myAtlReportError(GetObjectCLSID(), e);
|
||||
}
|
||||
|
||||
/* 'Bind socket to LocalHostIP
|
||||
msaLocalAddr.sin_family = PF_INET
|
||||
msaLocalAddr.sin_port = 0
|
||||
@@ -185,7 +209,6 @@ STDMETHODIMP CWinSock::isDataAvailable()
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
|
||||
STDMETHODIMP CWinSock::ReceiveData(BSTR* sData)
|
||||
{
|
||||
char server_reply[8192];
|
||||
@@ -196,22 +219,19 @@ STDMETHODIMP CWinSock::ReceiveData(BSTR* sData)
|
||||
return myAtlReportError(GetObjectCLSID(), "\nCWinSock: Recv failed %d", WSAGetLastError());
|
||||
}
|
||||
|
||||
//Add a NULL terminating character to make it a proper string before printing
|
||||
if (recv_size >= sizeof(server_reply))
|
||||
server_reply[sizeof(server_reply) - 1] = '\0';
|
||||
else
|
||||
server_reply[recv_size] = '\0';
|
||||
|
||||
CComBSTR bstrString(server_reply);
|
||||
CComBSTR bstrString(recv_size, server_reply);
|
||||
return bstrString.CopyTo(sData);
|
||||
}
|
||||
|
||||
|
||||
STDMETHODIMP CWinSock::ShutdownConnection()
|
||||
{
|
||||
shutdown(m_socket, SD_BOTH);
|
||||
closesocket(m_socket);
|
||||
WSACleanup();
|
||||
if (m_must_close)
|
||||
{
|
||||
shutdown(m_socket, SD_BOTH);
|
||||
closesocket(m_socket);
|
||||
WSACleanup();
|
||||
}
|
||||
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
@@ -26,9 +26,8 @@ class ATL_NO_VTABLE CWinSock :
|
||||
public IDispatchImpl<IWinSock, &IID_IWinSock, &LIBID_SLNKDWFLib, /*wMajor =*/ 1, /*wMinor =*/ 0>
|
||||
{
|
||||
public:
|
||||
CWinSock()
|
||||
{
|
||||
}
|
||||
CWinSock();
|
||||
~CWinSock();
|
||||
|
||||
DECLARE_REGISTRY_RESOURCEID(IDR_WINSOCK)
|
||||
|
||||
@@ -72,6 +71,7 @@ public:
|
||||
|
||||
private:
|
||||
SOCKET m_socket;
|
||||
bool m_must_close;
|
||||
CString m_LocalHostIP;
|
||||
CString m_RemoteHostIP;
|
||||
ULONG m_RemotePort;
|
||||
|
||||
Reference in New Issue
Block a user