.h文件
#pragma once
#include "xsocket.h"
#include "clientsocket.h"
#define INVALID_STATUS -1
class CServerSocket : public CXSocket
{
Lock cs;
int m_iStatus;
protected:
int Listen();
SOCKET Accept(struct sockaddr *pClientAddr, int iAddrLen);
public:
CServerSocket(int iPort);
virtual ~CServerSocket(void);
public:
virtual CClientSocket* Accept();
int GetStatus()
{
return m_iStatus;
}
};
.cpp文件
#include "StdAfx.h"
#include "serversocket.h"
#include "lock.h"
CServerSocket::CServerSocket(int iPort)
{
m_iStatus = INVALID_STATUS;
if(FAIL == CreateSocket())
{
Err("CServerSocket::CServerSocket-CreateSocket 失败:[%d]/n", GetLastError());
return;
}
struct sockaddr_in stServerSockAddr;
InitSockAddr(stServerSockAddr, NULL, iPort);
if(0 > Bind(stServerSockAddr))
{
Err("CServerSocket::CServerSocket-Bind 失败:[%d]/n", GetLastError());
return;
}
if(0 > (m_iStatus = Listen()))
{
Err("CServerSocket::CServerSocket-Listen 失败:[%d]/n", GetLastError());
}
}
CServerSocket::~CServerSocket(void)
{
m_iStatus = INVALID_STATUS;
}
int CServerSocket::Listen()
{
return listen(m_Socket, 5);
}
SOCKET CServerSocket::Accept(struct sockaddr_in* pClientAddr, int iAddrLen)
{
return accept(m_Socket, (SOCKADDR*)pClientAddr,&iAddrLen);
}
CClientSocket *CServerSocket::Accept()
{
LOCK(cs);
int iErr = SEL_FAIL;
while(SEL_TIMEOUT == (iErr = SelectRecv(NULL)))
{
//接受超时处理
Warn("CServerSocket::Accept-SelectRecv 超时[Timeout:%d(sec)],[ErrorCode:%d]", m_iTimeOut, GetLastError());
//TO ADD :TimeOut 处理
}
if(SEL_FAIL == iErr)
{
Err("CServerSocket::Accept-SelectRecv 失败:[ErrorCode:%d]", GetLastError());
return NULL;
}
CClientSocket* pClient = new CClientSocket();
pClient->m_Socket = Accept(&pClient->m_stClientSockAddr, sizeof(SOCKADDR_IN));
return pClient;
}