Ejemplo n.º 1
0
bool CHahsEngine::AddUdpConn(const CSockAddr & bindAddr, const CSockAddr & connectAddr, const CRecvHelper & recvHelper)
{
    typedef CSharedPtr<CUdpSocket, false> __FileGuard;
    LOCAL_LOGGER(logger, "CHahsEngine::AddUdpConn");
    DEBUG("bindAddr="<<bindAddr.ToString()<<", connectAddr="<<connectAddr.ToString()<<", recvHelper=@"<<&recvHelper);
    __FileGuard file = dynamic_cast<__FileGuard::pointer>(IFileDesc::GetObject(FD_UDP));
    if(!file){
        ERROR("cannot get file object for connectAddr="<<connectAddr.ToString());
        return false;
    }
    if(bindAddr.IsValid()){
        if(!file->Bind(bindAddr)){
            ERROR("cannot bind addr="<<bindAddr.ToString()<<IFileDesc::ErrMsg());
            return false;
        }
    }
    if(connectAddr.IsValid()){
        if(!file->Connect(connectAddr)){
            ERROR("cannot connect addr="<<connectAddr.ToString()<<IFileDesc::ErrMsg());
            return false;
        }
    }
    if(!file->SetBlock(false)){
        ERROR("set non-blocking failed for file="<<Tools::ToStringPtr(file));
        return false;
    }
    DEBUG("file="<<Tools::ToStringPtr(file));
    __SockPtr sock = CSockSession::GetObject(&*file, recvHelper);
    if(!sock){
        ERROR("cannot get sock session for file="<<Tools::ToStringPtr(file));
        return false;
    }
    file.release();
    return addSock(sock, EVENT_IN);     //根据sock的处理步骤决定
}
Ejemplo n.º 2
0
bool CHahsEngine::AddTcpListen(const CSockAddr & bindAddr, const CRecvHelper & recvHelper)
{
    typedef CSharedPtr<CListenSocket, false> __FileGuard;
    LOCAL_LOGGER(logger, "CHahsEngine::AddTcpListen");
    assert(bindAddr.IsValid());
    DEBUG("bindAddr="<<bindAddr.ToString()<<", recvHelper=@"<<&recvHelper);
    __FileGuard file = dynamic_cast<__FileGuard::pointer>(IFileDesc::GetObject(FD_TCP_LISTEN));
    if(!file){
        ERROR("cannot get file object for bindAddr="<<bindAddr.ToString());
        return false;
    }
    if(!file->Listen(bindAddr, false)){
        ERROR("cannot listen bindAddr="<<bindAddr.ToString()<<IFileDesc::ErrMsg());
        return false;
    }
    if(!file->SetBlock(false)){
        ERROR("set non-blocking failed for file="<<Tools::ToStringPtr(file));
        return false;
    }
    TRACE("file="<<Tools::ToStringPtr(file));
    __SockPtr sock = CSockSession::GetObject(&*file, recvHelper);
    if(!sock){
        ERROR("cannot get sock session for file="<<Tools::ToStringPtr(file));
        return false;
    }
    file.release();
    return addSock(sock, EVENT_IN);
}
Ejemplo n.º 3
0
int main(int argc, char **argv) {
    int ret;
    int clientSock;
    int size;
    char buf[1024];
    char prefix[32];
    int i;
    int n;
    socklen_t len;
    struct sockaddr_in clientAddr;

    if(initSock(8000) < 0)
        return -1;

    while(1) {
        n = mSelect();
        if(FD_ISSET(socks[0], &rfds)) {
            size = sizeof(clientAddr);
            clientSock = accept(socks[0], (struct sockaddr *)&clientAddr, &size);
            if(clientSock < 0) {
                perror("Accept failed");
                continue;
            }
            addSock(clientSock);
        }
        for(i=1; i<=maxNum; i++) {
            if(socks[i] == -1)
                continue;
            if(FD_ISSET(socks[i], &rfds)) {
                size = recv(socks[i], buf, 1023, 0);
                if(size < 0) {
                    if(errno == ECONNRESET)
                        removeSock(i);
                    else
                        perror("recv error");
                }
                else if(size == 0) {
                    removeSock(i);
                }
                getpeername(socks[i], (struct sockaddr *)&clientAddr, &len);
                char *ip = inet_ntoa(clientAddr.sin_addr);
                sprintf(prefix, "[%s]:", ip);
                sendMsg(prefix, strlen(prefix));
                sendMsg(buf, size);
            }
        }
    }
    close(socks[0]);
    return 0;
}