现在的位置: 首页 > 综合 > 正文

connect, accept .listen, send ,recv, setblock等系列的封装

2013年01月17日 ⁄ 综合 ⁄ 共 2691字 ⁄ 字号 评论关闭

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));//设置发送超时
}

抱歉!评论已关闭.