Files
mir_server/sdk/system/CustomSocketWin.cpp
aixianling 5c9f1dae4a init
2025-01-09 17:45:40 +08:00

294 lines
5.3 KiB
C++

#include "SocketConfig.h"
#ifdef CONFIG_USE_WIN_SOCKET
using namespace wylib::inet::socket;
int CCustomSocket::setBlockMode(const bool block)
{
u_long ulock;
if ( block == m_boBlock )
return 0;
if ( m_nSocket != INVALID_SOCKET )
{
ulock = block ? 0 : 1;
if ( ioctlsocket( m_nSocket, FIONBIO, &ulock ) )
{
return WSAGetLastError();
}
}
m_boBlock = block;
return 0;
}
VOID CCustomSocket::close()
{
if ( m_nSocket != INVALID_SOCKET )
{
if ( m_boConnected )
{
Disconnected();
}
closesocket( m_nSocket );
m_nSocket = INVALID_SOCKET;
}
m_boConnected = false;
m_boConnecting = false;
m_boBlock = true;
}
INT CCustomSocket::shutDown(const INT sd)
{
INT nErr = 0;
if ( m_boConnected && m_nSocket != INVALID_SOCKET )
{
nErr = shutdown( m_nSocket, sd );
if ( nErr == 0 )
{
m_boConnected = false;
m_boConnecting = false;
Disconnected();
}
}
return 0;
}
INT CCustomSocket::bind(const ULONG addr, const INT port)
{
INT nErr;
SOCKADDR_IN addrin;
ZeroMemory(&addrin, sizeof(addrin));
addrin.sin_family = AF_INET;
addrin.sin_addr.s_addr = addr;
addrin.sin_port = htons(port);
nErr = ::bind( m_nSocket, (sockaddr*)&addrin, sizeof(addrin) );
if ( nErr == 0 )
{
m_LocalAddr = addrin;
}
return nErr ? WSAGetLastError() : 0;
}
INT CCustomSocket::bind(const char * addr, const INT port)
{
hostent *phost;
#ifdef UNICODE
wylib::string::CWideString ws(addr);
wylib::string::CAnsiString *as = ws.toAStr();
phost = gethostbyname(*as);
delete as;
#else
phost = gethostbyname(addr);
#endif
if ( phost )
{
in_addr addr;
addr.s_addr = *(u_long*)phost->h_addr_list[0];
return bind( addr.s_addr, port );
}
return WSAGetLastError();
}
INT CCustomSocket::getRecvBufSize(ULONG *size)
{
int oplen = sizeof(*size);
int nErr = getsockopt( m_nSocket, SOL_SOCKET, SO_RCVBUF, (char*)size, &oplen );
return nErr ? WSAGetLastError() : 0;
}
INT CCustomSocket::setRecvBufSize(ULONG size)
{
int nErr = setsockopt( m_nSocket, SOL_SOCKET, SO_RCVBUF, (char*)&size, sizeof(size) );
return nErr ? WSAGetLastError() : 0;
}
INT CCustomSocket::getSendBufSize(ULONG *size)
{
int oplen = sizeof(*size);
int nErr = getsockopt( m_nSocket, SOL_SOCKET, SO_SNDBUF, (char*)size, &oplen );
return nErr ? WSAGetLastError() : 0;
}
INT CCustomSocket::setSendBufSize(ULONG size)
{
int nErr = setsockopt( m_nSocket, SOL_SOCKET, SO_SNDBUF, (char*)&size, sizeof(size) );
return nErr ? WSAGetLastError() : 0;
}
INT CCustomSocket::listen(const INT backlog)
{
int nErr;
nErr = ::listen( m_nSocket, backlog );
return nErr ? WSAGetLastError() : 0;
}
int CCustomSocket::connect(const char * addr, const INT port)
{
hostent *phost;
#ifdef UNICODE
wylib::string::CWideString ws(addr);
wylib::string::CAnsiString *as = ws.toAStr();
phost = gethostbyname(*as);
delete as;
#else
phost = gethostbyname(addr);
#endif
if ( phost )
{
in_addr addr;
addr.s_addr = *(u_long*)phost->h_addr_list[0];
return connect( addr.s_addr, port );
}
return WSAGetLastError();
}
INT CCustomSocket::accept(SOCKET *socket, unsigned long wait_msec, PSOCKADDR_IN addr)
{
int nErr;
fd_set set;
timeval tv;
int addrsize;
FD_ZERO( &set );
FD_SET( m_nSocket, &set );
tv.tv_sec = long(wait_msec / 1000);
tv.tv_usec = long(wait_msec * 1000);
nErr = select( int(m_nSocket + 1), &set, NULL, NULL, &tv );
if ( nErr < 0 )
return WSAGetLastError();
if ( nErr > 0 )
{
addrsize = sizeof(*addr);
*socket = ::accept( m_nSocket, (sockaddr*)addr, &addrsize );
if ( *socket == INVALID_SOCKET )
{
return WSAGetLastError();
}
return 0;
}
return SOCKET_ERROR - 1;
}
INT CCustomSocket::connect(const ULONG addr, const INT port)
{
int nErr;
SOCKADDR_IN addrin;
ZeroMemory(&addrin, sizeof(addrin));
addrin.sin_family = AF_INET;
addrin.sin_addr.s_addr = addr;
addrin.sin_port = htons(port);
nErr = ::connect( m_nSocket, (sockaddr*)&addrin, sizeof(addrin) );
if ( nErr == 0 )
{
m_boConnected = true;
m_boConnecting = false;
Connected();
}
else
{
nErr = WSAGetLastError();
if ( nErr == WSAEWOULDBLOCK )
{
nErr = 0;
m_boConnected = false;
m_boConnecting = true;
}
}
return nErr;
}
INT CCustomSocket::createSocket(SOCKET *socket, const INT af, const int type, const int protocol)
{
*socket = ::socket( af, type, protocol );
if ( *socket == INVALID_SOCKET )
{
return WSAGetLastError();
}
return 0;
}
INT CCustomSocket::recv(LPVOID buf, INT len, const INT flags)
{
int nErr = ::recv( m_nSocket, (char*)buf, len, flags );
if ( nErr == 0 )
{
close();
}
else if ( nErr < 0 )
{
if ( !m_boBlock )
{
nErr = WSAGetLastError();
if ( nErr != WSAEWOULDBLOCK )
{
SocketError( nErr );
nErr = -1;
}
else nErr = SOCKET_ERROR - 1;
}
}
return nErr;
}
INT CCustomSocket::send(LPVOID buf, INT len, const INT flags)
{
int nRet, nErr;
char *ptr = (char*)buf;
nRet = 0;
while ( len > 0 )
{
nErr = ::send( m_nSocket, (char*)ptr, len, flags );
if ( nErr == 0 )
{
nRet = 0;
close();
break;
}
else if ( nErr < 0 )
{
if ( !m_boBlock )
{
nErr = WSAGetLastError();
if ( nErr != WSAEWOULDBLOCK )
{
nRet = SOCKET_ERROR;
SocketError( WSAGetLastError() );
}
else if ( nRet == 0 )
{
nRet = SOCKET_ERROR - 1;
}
}
break;
}
else
{
nRet += nErr;
ptr += nErr;
len -= nErr;
}
}
return nRet;
}
#endif