serversocket 类

.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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值