bool CSock::Listen(int nConnectionBacklog)
{
return listen(m_sock, nConnectionBacklog) != SOCKET_ERROR;
}
bool CSock::Accept(CKKSock &rConnectedSocket, SOCKADDR *lpSockAddr, int *lpSockAddrLen)
{
SOCKET hTemp = accept(m_sock, lpSockAddr, lpSockAddrLen);
if (hTemp == INVALID_SOCKET)
{
//DWORD dwProblem = GetLastError();
rConnectedSocket.m_sock = INVALID_SOCKET;
//SetLastError(dwProblem);
}
else
{
rConnectedSocket.m_sock = hTemp;
}
return (hTemp != INVALID_SOCKET);
}
bool CSock::Accept(SOCKET &socket, SOCKADDR *lpSockAddr, int *lpSockAddrLen)
{
socket = accept(m_sock, lpSockAddr, lpSockAddrLen);
if (socket == INVALID_SOCKET)
{
DWORD dwProblem = GetLastError();
socket = INVALID_SOCKET;
SetLastError(dwProblem);
}
return (socket != INVALID_SOCKET);
}
int CSock::Send(const void *lpBuf, int nBufLen, int nFlags)
{
return send(m_sock, (LPSTR)lpBuf, nBufLen, nFlags);
}
int CSock::Receive(void *lpBuf, int nBufLen, int nFlags)
{
return recv(m_sock, (LPSTR)lpBuf, nBufLen, nFlags);
}
bool CSock::IsInvaild()
{
return m_sock == INVALID_SOCKET;
}
void CSock::SetBlock(bool block)
{
u_long b = block ? 0 : 1;
ioctlsocket(m_sock, FIONBIO, &b);
}
int CSock::Connect(LPCTSTR lpszHostAddress, UINT nHostPort, bool bBlock)
{
if (m_sock == INVALID_SOCKET)
{
Create(AF_INET, SOCK_STREAM, 0);
}
SetBlock(bBlock);
ASSERT(lpszHostAddress != NULL);
SOCKADDR_IN sockAddr;
memset(&sockAddr,0,sizeof(sockAddr));
LPSTR lpszAscii = T2A((LPTSTR)lpszHostAddress);
sockAddr.sin_family = AF_INET;
sockAddr.sin_addr.s_addr = inet_addr(lpszAscii);
if (sockAddr.sin_addr.s_addr == INADDR_NONE)
{
LPHOSTENT lphost;
lphost = gethostbyname(lpszAscii);
if (lphost != NULL)
sockAddr.sin_addr.s_addr = ((LPIN_ADDR)lphost->h_addr)->s_addr;
else
{
WSASetLastError(WSAEINVAL);
return -1;
}
}
sockAddr.sin_port = htons((u_short)nHostPort);
return connect(m_sock, (SOCKADDR*)&sockAddr, sizeof(sockAddr));
/*u_long start = GetTickCount();
int result;
while(1)//POLL_TIMEOUT
{
result = m_sock.Wait(5000, WAIT_CONNECT);
if (result == WAIT_ERROR)
return -1;
if (result & WAIT_CONNECT)
break;
if(result == 10060 || (start + 30000) > GetTickCount())
{
// Connection timeout
//fail(STRING(CONNECTION_TIMEOUT));
return 0;
}
}
return 1;*/
}
void CSock::Attach(SOCKET sock)
{
m_sock = sock;
}
/*******************************
* 设置socket的缓冲buffer的大小
* add by gavin on 2006.3.6
*******************************/
void CSock::SetSockBuff(long nSockRecvBufferLen,long nSockSendBufferLen)
{
int nTimeOut = 500;
int nErrorNum = 0;
int nFlagValue = 0;
setsockopt(m_sock,SOL_SOCKET,SO_SNDBUF,(char*)&nSockSendBufferLen,sizeof(int));
setsockopt(m_sock,SOL_SOCKET,SO_RCVBUF,(char*)&nSockRecvBufferLen,sizeof(int));
nFlagValue = setsockopt(m_sock,SOL_SOCKET,SO_SNDTIMEO,(char*)&nTimeOut,sizeof(nTimeOut));//设置发送超时
nFlagValue = setsockopt(m_sock,SOL_SOCKET,SO_RCVTIMEO,(char*)&nTimeOut,sizeof(nTimeOut));//设置发送超时
}