📄 asyncsocketex.cpp
字号:
int nSockAddrLen;
if (m_SocketData.nFamily == AF_INET6)
{
sockAddr = (SOCKADDR*)new SOCKADDR_IN6;
nSockAddrLen = sizeof(SOCKADDR_IN6);
}
else if (m_SocketData.nFamily == AF_INET)
{
sockAddr = (SOCKADDR*)new SOCKADDR_IN;
nSockAddrLen = sizeof(SOCKADDR_IN);
}
memset(sockAddr, 0, nSockAddrLen);
BOOL bResult = GetPeerName(sockAddr, &nSockAddrLen);
if (bResult)
{
if (m_SocketData.nFamily == AF_INET6)
{
rPeerPort = ntohs(((SOCKADDR_IN6*)sockAddr)->sin6_port);
LPTSTR buf = Inet6AddrToString(((SOCKADDR_IN6*)sockAddr)->sin6_addr);
rPeerAddress = buf;
delete [] buf;
}
else if (m_SocketData.nFamily == AF_INET)
{
rPeerPort = ntohs(((SOCKADDR_IN*)sockAddr)->sin_port);
rPeerAddress = inet_ntoa(((SOCKADDR_IN*)sockAddr)->sin_addr);
}
else
{
delete sockAddr;
return FALSE;
}
}
delete sockAddr;
return bResult;
}
#endif //_AFX
BOOL CAsyncSocketEx::GetPeerName( SOCKADDR* lpSockAddr, int* lpSockAddrLen )
{
#ifndef NOLAYERS
if (m_pFirstLayer)
return m_pFirstLayer->GetPeerName(lpSockAddr, lpSockAddrLen);
#endif //NOLAYERS
if (!getpeername(m_SocketData.hSocket, lpSockAddr, lpSockAddrLen))
return TRUE;
else
return FALSE;
}
#ifdef _AFX
BOOL CAsyncSocketEx::GetSockName(CString& rSocketAddress, UINT& rSocketPort)
{
SOCKADDR* sockAddr;
int nSockAddrLen;
if (m_SocketData.nFamily == AF_INET6)
{
sockAddr = (SOCKADDR*)new SOCKADDR_IN6;
nSockAddrLen = sizeof(SOCKADDR_IN6);
}
else if (m_SocketData.nFamily == AF_INET)
{
sockAddr = (SOCKADDR*)new SOCKADDR_IN;
nSockAddrLen = sizeof(SOCKADDR_IN);
}
memset(sockAddr, 0, nSockAddrLen);
BOOL bResult = GetSockName(sockAddr, &nSockAddrLen);
if (bResult)
{
if (m_SocketData.nFamily == AF_INET6)
{
rSocketPort = ntohs(((SOCKADDR_IN6*)sockAddr)->sin6_port);
LPTSTR buf = Inet6AddrToString(((SOCKADDR_IN6*)sockAddr)->sin6_addr);
rSocketAddress = buf;
delete [] buf;
}
else if (m_SocketData.nFamily == AF_INET)
{
rSocketPort = ntohs(((SOCKADDR_IN*)sockAddr)->sin_port);
rSocketAddress = inet_ntoa(((SOCKADDR_IN*)sockAddr)->sin_addr);
}
else
{
delete sockAddr;
return FALSE;
}
}
delete sockAddr;
return bResult;
}
#endif //_AFX
BOOL CAsyncSocketEx::GetSockName( SOCKADDR* lpSockAddr, int* lpSockAddrLen )
{
if ( !getsockname(m_SocketData.hSocket, lpSockAddr, lpSockAddrLen) )
return TRUE;
else
return FALSE;
}
BOOL CAsyncSocketEx::ShutDown(int nHow /*=sends*/)
{
#ifndef NOLAYERS
if (m_pFirstLayer)
{
return m_pFirstLayer->ShutDown();
}
else
#endif //NOLAYERS
{
if (!shutdown(m_SocketData.hSocket, nHow))
return TRUE;
else
return FALSE;
}
}
SOCKET CAsyncSocketEx::Detach()
{
SOCKET socket = m_SocketData.hSocket;
DetachHandle(socket);
m_SocketData.hSocket = INVALID_SOCKET;
m_SocketData.nFamily = AF_UNSPEC;
return socket;
}
BOOL CAsyncSocketEx::Attach(SOCKET hSocket, long lEvent /*= FD_READ | FD_WRITE | FD_OOB | FD_ACCEPT | FD_CONNECT | FD_CLOSE*/)
{
if (hSocket==INVALID_SOCKET || !hSocket)
return FALSE;
VERIFY(InitAsyncSocketExInstance());
m_SocketData.hSocket=hSocket;
AttachHandle(hSocket);
#ifndef NOLAYERS
if (m_pFirstLayer)
{
m_lEvent = lEvent;
return !WSAAsyncSelect(m_SocketData.hSocket, GetHelperWindowHandle(), m_SocketData.nSocketIndex+WM_SOCKETEX_NOTIFY, FD_READ | FD_WRITE | FD_OOB | FD_ACCEPT | FD_CONNECT | FD_CLOSE);
}
else
#endif //NOLAYERS
{
return AsyncSelect(lEvent);
}
}
BOOL CAsyncSocketEx::AsyncSelect( long lEvent /*= FD_READ | FD_WRITE | FD_OOB | FD_ACCEPT | FD_CONNECT | FD_CLOSE*/ )
{
ASSERT(m_pLocalAsyncSocketExThreadData);
m_lEvent = lEvent;
#ifndef NOLAYERS
if (m_pFirstLayer)
return TRUE;
else
#endif //NOLAYERS
{
if (m_SocketData.hSocket == INVALID_SOCKET && m_SocketData.nFamily == AF_UNSPEC)
return true;
if ( !WSAAsyncSelect(m_SocketData.hSocket, GetHelperWindowHandle(), m_SocketData.nSocketIndex+WM_SOCKETEX_NOTIFY, lEvent) )
return TRUE;
else
return FALSE;
}
return TRUE;
}
BOOL CAsyncSocketEx::Listen( int nConnectionBacklog /*=5*/ )
{
#ifndef NOLAYERS
if (m_pFirstLayer)
return m_pFirstLayer->Listen(nConnectionBacklog);
#endif //NOLAYERS
if (!listen(m_SocketData.hSocket, nConnectionBacklog))
{
#ifndef NOSOCKETSTATES
SetState(listening);
#endif //NOSOCKETSTATES
return TRUE;
}
else
return FALSE;
}
BOOL CAsyncSocketEx::Accept( CAsyncSocketEx& rConnectedSocket, SOCKADDR* lpSockAddr /*=NULL*/, int* lpSockAddrLen /*=NULL*/ )
{
ASSERT(rConnectedSocket.m_SocketData.hSocket == INVALID_SOCKET);
#ifndef NOLAYERS
if (m_pFirstLayer)
{
return m_pFirstLayer->Accept(rConnectedSocket, lpSockAddr, lpSockAddrLen);
}
else
#endif //NOLAYERS
{
SOCKET hTemp = accept(m_SocketData.hSocket, lpSockAddr, lpSockAddrLen);
if (hTemp == INVALID_SOCKET)
return FALSE;
VERIFY(rConnectedSocket.InitAsyncSocketExInstance());
rConnectedSocket.m_SocketData.hSocket=hTemp;
rConnectedSocket.AttachHandle(hTemp);
rConnectedSocket.SetFamily(GetFamily());
#ifndef NOSOCKETSTATES
rConnectedSocket.SetState(connected);
#endif //NOSOCKETSTATES
}
return TRUE;
}
BOOL CAsyncSocketEx::IOCtl( long lCommand, DWORD* lpArgument )
{
return ioctlsocket(m_SocketData.hSocket, lCommand, lpArgument) != SOCKET_ERROR;
}
int CAsyncSocketEx::GetLastError()
{
return WSAGetLastError();
}
BOOL CAsyncSocketEx::TriggerEvent(long lEvent)
{
if (m_SocketData.hSocket==INVALID_SOCKET)
return FALSE;
ASSERT(m_pLocalAsyncSocketExThreadData);
ASSERT(m_pLocalAsyncSocketExThreadData->m_pHelperWindow);
ASSERT(m_SocketData.nSocketIndex!=-1);
#ifndef NOLAYERS
if (m_pFirstLayer)
{
CAsyncSocketExLayer::t_LayerNotifyMsg *pMsg = new CAsyncSocketExLayer::t_LayerNotifyMsg;
pMsg->hSocket = m_SocketData.hSocket;
pMsg->lEvent=lEvent%0xFFFF;
pMsg->pLayer=0;
BOOL res=PostMessage(GetHelperWindowHandle(), WM_USER, (WPARAM)m_SocketData.nSocketIndex, (LPARAM)pMsg);
if (!res)
delete pMsg;
return res;
}
else
#endif //NOLAYERS
return PostMessage(GetHelperWindowHandle(), m_SocketData.nSocketIndex+WM_SOCKETEX_NOTIFY, m_SocketData.hSocket, lEvent%0xFFFF);
}
SOCKET CAsyncSocketEx::GetSocketHandle()
{
return m_SocketData.hSocket;
}
HWND CAsyncSocketEx::GetHelperWindowHandle()
{
if (!m_pLocalAsyncSocketExThreadData)
return 0;
if (!m_pLocalAsyncSocketExThreadData->m_pHelperWindow)
return 0;
return m_pLocalAsyncSocketExThreadData->m_pHelperWindow->GetHwnd();
}
#ifndef NOLAYERS
BOOL CAsyncSocketEx::AddLayer(CAsyncSocketExLayer *pLayer)
{
ASSERT(pLayer);
if (m_pFirstLayer)
{
ASSERT(m_pLastLayer);
m_pLastLayer=m_pLastLayer->AddLayer(pLayer, this);
return m_pLastLayer?TRUE:FALSE;
}
else
{
ASSERT(!m_pLastLayer);
pLayer->Init(0, this);
m_pFirstLayer=pLayer;
m_pLastLayer=m_pFirstLayer;
if (m_SocketData.hSocket != INVALID_SOCKET)
if (WSAAsyncSelect(m_SocketData.hSocket, GetHelperWindowHandle(), m_SocketData.nSocketIndex+WM_SOCKETEX_NOTIFY, FD_READ | FD_WRITE | FD_OOB | FD_ACCEPT | FD_CONNECT | FD_CLOSE))
return FALSE;
}
return TRUE;
}
void CAsyncSocketEx::RemoveAllLayers()
{
for (std::list<t_callbackMsg>::iterator iter = m_pendingCallbacks.begin(); iter != m_pendingCallbacks.end(); iter++)
delete [] iter->str;
m_pendingCallbacks.clear();
m_pFirstLayer = 0;
m_pLastLayer = 0;
if (!m_pLocalAsyncSocketExThreadData)
return;
if (!m_pLocalAsyncSocketExThreadData->m_pHelperWindow)
return;
m_pLocalAsyncSocketExThreadData->m_pHelperWindow->RemoveLayers(this);
}
int CAsyncSocketEx::OnLayerCallback(std::list<t_callbackMsg>& callbacks)
{
for (std::list<t_callbackMsg>::iterator iter = callbacks.begin(); iter != callbacks.end(); iter++)
{
delete [] iter->str;
}
return 0;
}
BOOL CAsyncSocketEx::IsLayerAttached() const
{
return m_pFirstLayer ? TRUE : FALSE;
}
#endif //NOLAYERS
BOOL CAsyncSocketEx::GetSockOpt(int nOptionName, void* lpOptionValue, int* lpOptionLen, int nLevel /*=SOL_SOCKET*/)
{
return (SOCKET_ERROR != getsockopt(m_SocketData.hSocket, nLevel, nOptionName, (LPSTR)lpOptionValue, lpOptionLen));
}
BOOL CAsyncSocketEx::SetSockOpt(int nOptionName, const void* lpOptionValue, int nOptionLen, int nLevel /*=SOL_SOCKET*/)
{
return (SOCKET_ERROR != setsockopt(m_SocketData.hSocket, nLevel, nOptionName, (LPSTR)lpOptionValue, nOptionLen));
}
#ifndef NOSOCKETSTATES
int CAsyncSocketEx::GetState() const
{
return m_nState;
}
void CAsyncSocketEx::SetState(int nState)
{
m_nState = nState;
}
#endif //NOSOCKETSTATES
int CAsyncSocketEx::GetFamily() const
{
return m_SocketData.nFamily;
}
bool CAsyncSocketEx::SetFamily(int nFamily)
{
if (m_SocketData.nFamily != AF_UNSPEC)
return false;
m_SocketData.nFamily = nFamily;
return true;
}
bool CAsyncSocketEx::TryNextProtocol()
{
DetachHandle(m_SocketData.hSocket);
closesocket(m_SocketData.hSocket);
m_SocketData.hSocket = INVALID_SOCKET;
BOOL ret = FALSE;
for (; m_SocketData.nextAddr; m_SocketData.nextAddr = m_SocketData.nextAddr->ai_next)
{
m_SocketData.hSocket = socket(m_SocketData.nextAddr->ai_family, m_SocketData.nextAddr->ai_socktype, m_SocketData.nextAddr->ai_protocol);
if (m_SocketData.hSocket == INVALID_SOCKET)
continue;
AttachHandle(m_SocketData.hSocket);
m_SocketData.nFamily = m_SocketData.nextAddr->ai_family;
if (!AsyncSelect(m_lEvent))
{
DetachHandle(m_SocketData.hSocket);
closesocket(m_SocketData.hSocket);
m_SocketData.hSocket = INVALID_SOCKET;
continue;
}
#ifndef NOLAYERS
if (m_pFirstLayer)
{
if (WSAAsyncSelect(m_SocketData.hSocket, GetHelperWindowHandle(), m_SocketData.nSocketIndex+WM_SOCKETEX_NOTIFY, FD_READ | FD_WRITE | FD_OOB | FD_ACCEPT | FD_CONNECT | FD_CLOSE))
{
DetachHandle(m_SocketData.hSocket);
closesocket(m_SocketData.hSocket);
m_SocketData.hSocket = INVALID_SOCKET;
continue;
}
}
#endif //NOLAYERS
if (!Bind(m_nSocketPort, m_lpszSocketAddress))
{
DetachHandle(m_SocketData.hSocket);
closesocket(m_SocketData.hSocket);
m_SocketData.hSocket = INVALID_SOCKET;
continue;
}
ret = CAsyncSocketEx::Connect(m_SocketData.nextAddr->ai_addr, m_SocketData.nextAddr->ai_addrlen);
if (!ret && GetLastError() != WSAEWOULDBLOCK)
{
DetachHandle(m_SocketData.hSocket);
closesocket(m_SocketData.hSocket);
m_SocketData.hSocket = INVALID_SOCKET;
continue;
}
ret = true;
break;
}
if (m_SocketData.nextAddr)
m_SocketData.nextAddr = m_SocketData.nextAddr->ai_next;
if (!m_SocketData.nextAddr)
{
p_freeaddrinfo(m_SocketData.addrInfo);
m_SocketData.nextAddr = 0;
m_SocketData.addrInfo = 0;
}
if (m_SocketData.hSocket == INVALID_SOCKET || !ret)
return FALSE;
else
return TRUE;
}
#ifndef NOLAYERS
void CAsyncSocketEx::AddCallbackNotification(const t_callbackMsg& msg)
{
m_pendingCallbacks.push_back(msg);
if(m_pendingCallbacks.size() == 1 && m_SocketData.nSocketIndex != -1)
PostMessage(GetHelperWindowHandle(), WM_USER + 2, (WPARAM)m_SocketData.nSocketIndex, 0);
}
#endif //NOLAYERS
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -