Betere error handling WinSock

svn path=/Slnkdwf/trunk/; revision=26210
This commit is contained in:
Jos Groot Lipman
2015-09-07 19:38:19 +00:00
parent 6a380b99b3
commit 1217f64b61
3 changed files with 46 additions and 26 deletions

View File

@@ -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) ;

View File

@@ -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;
}

View File

@@ -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;