亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? ctpnet.cpp

?? 用UDP寫的可靠傳輸程序源代碼,非常有借鑒意義,適合互連網(wǎng)通訊
?? CPP
?? 第 1 頁 / 共 2 頁
字號:
// CCTPReceivedData - Buffer for storing received data and information about it
// CCTPErrorInfo - Buffer for storing error information
// CCTPNet - Class, which implements CTP
// Implementation file
//
// (c) Lev Naumov, CAMEL Laboratory
// E-mail: camellab@mail.ru
// For more information see http://camel.ifmo.ru or
// http://www.codeproject.com/internet/ctp.asp
/////////////////////////////////////////////////////////////////////////////

#include "stdafx.h"

#include "NetBasic.h"
#include "DebugLog.h"
#include "CTPNet.h"

// Macrodefinitions for handy log building

// Put message mess to output stream log, protecter by critical section cs
#define LOG(log,cs,mess) \
    if (log) { \
        char ts[22]; \
        CSingleLock lock(&cs,TRUE); \
        (((ostream&)*log)<<CCTPErrorInfo::GetTimeStamp(ts)<<" "<<mess<<"\n").flush();\
    }

// The same, but  string representation of ip-address ip can be referenced as
// "addr"
#define LOGA(log,cs,mess,ip) \
    if (log) { \
        char ts[22],saddr[16]; \
        ip.GetString(saddr); \
        CSingleLock lock(&cs,TRUE); \
        (((ostream&)*log)<<CCTPErrorInfo::GetTimeStamp(ts)<<" "<<mess<<"\n").flush();\
    }

// The same, but inserts description of header head between mess1 and mess2.
// Moreover, string representation of ip-address ip can be referenced as "addr"
#define LOGHA(log,cs,mess1,mess2,head,ip) \
    if (log) { \
        char ts[22],saddr[16]; \
        ip.GetString(saddr); \
        CSingleLock lock(&cs,TRUE); \
        ((ostream&)*log)<<CCTPErrorInfo::GetTimeStamp(ts)<<" "<<mess1;\
        head->ToStream(*log); \
        (((ostream&)*(log))<<mess2<<"\n").flush();\
    }

CCTPReceivedData::CCTPReceivedData(unsigned __int16 command, unsigned __int64 size, unsigned long from, char* buf)
{
    this->command=command;
    this->size=size;
    this->from=IPAddr(from);
    pBuf=new char[(unsigned int)size];
    if (buf) memcpy(pBuf,buf,(unsigned int)size);
}

CCTPErrorInfo::CCTPErrorInfo(unsigned char type,unsigned __int16 command,int code,IPAddr addr)
{
    this->type=type;
    this->command=command;
    this->code=code;
    this->addr=addr;
    GetTimeStamp(timestamp);
}

char* CCTPErrorInfo::GetTimeStamp(char* s)
{
    CHAR date[30]="";
    CHAR time[30]="";
    _timeb timebuffer;

    // Get date/time
    _strdate(date);
    _ftime(&timebuffer);
    _strtime(time);

    // Create string
    sprintf(s,"%8s %8s.%03d",date,time,timebuffer.millitm);
    return s;
}

void CCTPNet::Header::ToStream(ostream& out)
{
    if (command&CCTPNet::m_iConfirm) {
        out<<"{confirm: "<<(command^CCTPNet::m_iConfirm);
    } else {
        out<<"{command: "<<command;
    }
    out<<", id: "<<(unsigned int)id<<", size: "<<(unsigned int)size;
    if (amount>1) {
        out<<", num: "<<(unsigned int)number<<"("<<(unsigned int)amount<<")";
    }
    if (options) {
        out<<", opt: "<<options;
    }
    out<<"}";
}

bool CCTPNet::SntCommandInfo::Confirm(unsigned int i)
{
    CI[i].bConfirmed=true;
    for (unsigned int j=0; j<uCount; j++) {
        if (!CI[j].bConfirmed) return false;
    }

    return true;
}

bool CCTPNet::LargeCommandInfo::GotPart(unsigned int i)
{
    received[i]=true;
    for (unsigned int j=0; j<uCount; j++) {
        if (!received[j]) return false;
    }
    return true;
}

const unsigned __int8 CCTPNet::OptPing=CCTPNet::Options::DelAfterError|CCTPNet::Options::NoResend|CCTPNet::Options::UniqueCommand;
const unsigned __int16 CCTPNet::m_iConfirm=0x8000;

CCTPNet::CCTPNet(NetReceiver* receiver,unsigned short port,unsigned short servers,Times* times,ostream* log,unsigned __int16 packetdatasize,unsigned short maxdeliverers)
{
    // Tuning
    m_DefReceiver=receiver;
    m_uPort=port;
    if (times) m_Times=*times;
    m_uPacketDataSize=packetdatasize;
    m_pLog=log;

    // Initialize random generator
    srand((unsigned)time(NULL));

    // Initialization
    m_bSuspended=true;
    m_SntCommands.clear();
    m_Sessions.clear();
    m_LargeCommands.clear();
    m_Receivers.clear();
    m_pBuffer=new char[m_uPacketDataSize+GetHeaderSize()];
    m_Deliveries.clear();
    m_pDeliverTrds.clear();
    m_uMaxDeliverers=maxdeliverers;
    m_uBusy=0;

    CreateSockets();

    m_bKill=false;

    // Start threads and store handles
    for (unsigned int i=0;i<servers;i++) {
        m_pServerTrds.push_back(AfxBeginThread(CTPServerFunction,this));
    }
    m_pDelManTrd=AfxBeginThread(CTPDelManFunction,this);

    LOG(m_pLog,m_csLog,"CTP started on port "<<port<<" with "<<servers<<" servers\n");
}

CCTPNet::~CCTPNet()
{
    LOG(m_pLog,m_csLog,"CTP is shuting down");

    // Terminate threads
    m_bKill=true;
    DWORD time=GetTickCount();
    while ((!m_pDeliverTrds.empty()) || !m_pServerTrds.empty() || m_pDelManTrd) {
        Sleep(m_Times.uSleepOnDestroy);
        // Kill servers, deliverers and delivery manager if they are busy too long
        if (GetTickCount()-time>m_Times.uPeriodDestroy) {
            CSingleLock locks(&m_csServerTrds);
            LOCK(locks);
            for (vector<CWinThread*>::iterator it=m_pServerTrds.begin(); it!=m_pServerTrds.end(); it++) {
                LOG(m_pLog,m_csLog,"Server thread with handle "<<(*it)->m_hThread<<" was stopped forcedly");
                TerminateThread((*it)->m_hThread,0);
            }
            m_pServerTrds.clear();
            UNLOCK(locks);

            CSingleLock lockd(&m_csDeliverTrds);
            LOCK(lockd);
            for (it=m_pDeliverTrds.begin(); it!=m_pDeliverTrds.end(); it++) {
                LOG(m_pLog,m_csLog,"Deliverer thread with handle "<<(*it)->m_hThread<<" was stopped forcedly");
                TerminateThread((*it)->m_hThread,0);
            }
            m_pDeliverTrds.clear();
            UNLOCK(lockd);

            if (m_pDelManTrd) {
                LOG(m_pLog,m_csLog,"Delivery manager thread was stopped forcedly");
                TerminateThread(m_pDelManTrd->m_hThread,0);
            }
        }
    }

    // Free resources
    closesocket(m_SendSocket);
    closesocket(m_RecvSocket);
    FreeSntCommands();
    FreeSessions();
    FreeLargeCommands();
    FreeDeliveries();
    m_Receivers.clear();
    delete[] m_pBuffer;

    LOG(m_pLog,m_csLog,"CTP stopped");
}

bool CCTPNet::CreateSockets()
{
    LOG(m_pLog,m_csLog,"Creating sockets");

    CSingleLock lock(&m_csDeliveries);

    // Sockets creation
    m_SendSocket=socket(AF_INET, SOCK_DGRAM, 0);
    m_RecvSocket=socket(AF_INET, SOCK_DGRAM, 0);
    if (m_SendSocket==INVALID_SOCKET || m_RecvSocket==INVALID_SOCKET) {
        LOCK(lock);
        m_Deliveries.push_back(Delivery(m_DefReceiver,new CCTPErrorInfo(0,0,WSAGetLastError(),IPAddr())));
        UNLOCK(lock);
        LOG(m_pLog,m_csLog,"Failed to create sockets");
        m_bSuspended=true;
        return false;
    }
    // Sockets are to support broadcasting
    BOOL broadcast=TRUE;
    setsockopt(m_SendSocket,SOL_SOCKET,SO_BROADCAST,(char*)&broadcast,sizeof(broadcast));
    setsockopt(m_RecvSocket,SOL_SOCKET,SO_BROADCAST,(char*)&broadcast,sizeof(broadcast));

    // Binding local address with receiving socket
    m_Local.sin_family=AF_INET;
    m_Local.sin_port=htons(m_uPort);
    m_Local.sin_addr.s_addr=htonl(INADDR_ANY);
    if (bind(m_RecvSocket,(SOCKADDR*)&m_Local,sizeof(m_Local))==SOCKET_ERROR)
    {
        LOCK(lock);
        m_Deliveries.push_back(Delivery(m_DefReceiver,new CCTPErrorInfo(1,0,WSAGetLastError(),IPAddr())));
        UNLOCK(lock);
        LOG(m_pLog,m_csLog,"Failed to bind receiving socket");
        m_bSuspended=true;
        return false;
    }

    return true;
}

void CCTPNet::CheckupOptions(Header& header)
{
    if (header.amount>1 && header.options&Options::UniqueCommand) header.options^=Options::UniqueCommand;
    if (header.options&Options::StartSession) header.options^=Options::StartSession;
}

bool CCTPNet::Send(SmartBuffer& sb, unsigned __int16 command, IPAddr to, unsigned __int8 options, bool storeiffail)
{
    // Arrange header
    Header head;
    head.amount=sb.GetPacketsCount();
    head.command=command;
    head.messize=sb.GetDataSize();
    head.options=options;
    CheckupOptions(head);

    // Provide data with headers
    for (unsigned int i=0;i<head.amount;i++) {
        // Fill rest header information
        GetNextID(head,to);
        head.size=(unsigned __int16)sb.GetPacketSize(i);
        head.number=i;

        // Put header in the packet
        sb.PutHead(&head,i);
    }

    // Store message to be sent and pointer to it
    SntCommandInfo ci(sb,GetTickCount(),to.Solid);
    CSingleLock lock(&m_csSntCommands);
    LOCK(lock);
    m_SntCommands.push_back(ci);
    SntCommandInfoList::iterator curentry=--m_SntCommands.end();
    UNLOCK(lock);

    // Send packets
    for (i=0;i<head.amount;i++) {
        if (!SendPacket(sb.GetHeadPtr(i),to.Solid)) {
            // Store error information
            CSingleLock lock(&m_csDeliveries);
            LOCK(lock);
            m_Deliveries.push_back(Delivery(m_DefReceiver,new CCTPErrorInfo(2,head.command,WSAGetLastError(),IPAddr(to.Solid))));
            UNLOCK(lock);

            // Delete from sent packets storage if there was an error and storeiffail equals false
            if (!storeiffail) {
                CSingleLock lock(&m_csSntCommands);
                LOCK(lock);
                m_SntCommands.erase(curentry);
                UNLOCK(lock);
            }

            // Exit sending function with return value, which shows error
            return false;
        }
    }

    // Exit sending function with return value, which shows success
    return true;
}

bool CCTPNet::SendPacket(char* buf, unsigned long to)
{
    SOCKADDR_IN recip;
    recip.sin_family=AF_INET;
    recip.sin_port=htons(m_uPort);
    recip.sin_addr.s_addr=to;
    Header* head=(Header*)buf;

    LOGHA(m_pLog,m_csLog,"Send packet "," to "<<saddr,head,IPAddr(to));

    return (sendto(m_SendSocket,(const char*)buf,head->size,0,(SOCKADDR*)&recip,sizeof(recip))!=SOCKET_ERROR);
}

void CCTPNet::FreeSntCommands()
{
    CSingleLock lock(&m_csSntCommands);
    LOCK(lock);
    for (SntCommandInfoList::iterator it=m_SntCommands.begin();it!=m_SntCommands.end();it++) {
        it->Free();
    }
    m_SntCommands.clear();
    UNLOCK(lock);

    LOG(m_pLog,m_csLog,"Sent commands storage freed");
}

void CCTPNet::FreeSessions()
{
    CSingleLock lock(&m_csSessions);
    LOCK(lock);
    for (SessionsInfo::iterator it=m_Sessions.begin();it!=m_Sessions.end();it++) {
        it->second.received.clear();
    }
    m_Sessions.clear();
    UNLOCK(lock);

    LOG(m_pLog,m_csLog,"Sessions information storage freed");
}

void CCTPNet::FreeLargeCommands()
{
    CSingleLock lock(&m_csLargeCommands);
    LOCK(lock);
    for (LargeCommandInfoList::iterator it=m_LargeCommands.begin();it!=m_LargeCommands.end();it++) {
        it->Free();
        if (it->pRD) delete it->pRD;
    }
    m_LargeCommands.clear();
    UNLOCK(lock);

    LOG(m_pLog,m_csLog,"Large commands storage freed");
}

void CCTPNet::FreeDeliveries()
{
    for (DeliveriesList::iterator it=m_Deliveries.begin();it!=m_Deliveries.end();it++) {
        if (it->data) {
            if (it->type==DeliveryType::ReceivedData) delete (CCTPReceivedData*)it->data; else
            if (it->type==DeliveryType::ErrorInfo) delete (CCTPErrorInfo*)it->data; else
            delete it->data;
        }
    }
    m_Deliveries.clear();

    LOG(m_pLog,m_csLog,"Deliveries storage freed");
}

bool CCTPNet::SaveRcvPacket(unsigned long from,Header* head)
{
    CSingleLock lock(&m_csSessions);
    LOCK(lock);
    SessionInfo& si=GetSessionInfo(IPAddr(from),head->options&Options::Broadcast?true:false);

    if (si.received.empty()) {
        // First message from corresponding workstation
        si.received.push_back(head->id);
    } else {
        // Find place among already received messages
        if (Less(si.received.back(),head->id)) {
            si.received.push_back(head->id);
        } else {
            for (SessionInfo::RcvList::iterator it=si.received.begin();it!=si.received.end();it++) {
                // Already has been recieved
                if ((*it)==head->id) {
                    LOGHA(m_pLog,m_csLog,"Packet "," from "<<saddr<<" have been already received",head,IPAddr(from));
                    return false;
                }
                if (Less(head->id,*it)) {
                    // Already has been recieved
                    if (it==si.received.begin() && si.minwasset) {
                        LOGHA(m_pLog,m_csLog,"Packet "," from "<<saddr<<" have been already received",head,IPAddr(from));
                        return false;
                    }
                    // New one has been recieved
                    si.received.insert(it,head->id);
                    break;
                }
            }
        }

        // Remove ambigous information
        if (si.minwasset) {
            while ((si.received.front()+1)==*(++si.received.begin())) {
                si.received.pop_front();
            }
        }

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品欧美经典| 亚洲三级电影全部在线观看高清| 一区二区三区日韩精品| 99精品在线免费| 最新国产精品久久精品| 色婷婷一区二区| 婷婷六月综合网| 精品久久人人做人人爰| 国产在线国偷精品免费看| 国产日本欧美一区二区| 欧美乱妇20p| 国产午夜精品久久久久久免费视| 国产一区二区三区视频在线播放 | 久久国产麻豆精品| 久久一区二区三区国产精品| 丁香激情综合五月| 一区二区三区欧美亚洲| 欧美成人精品高清在线播放| 国v精品久久久网| 一区二区三区 在线观看视频| 7878成人国产在线观看| 国产精品69毛片高清亚洲| 日韩毛片视频在线看| 51精品国自产在线| 成人一区二区三区| 午夜天堂影视香蕉久久| 久久久久久久久伊人| 色吊一区二区三区 | 国产原创一区二区| 久久色在线观看| 国产日韩欧美综合一区| 一本久道久久综合中文字幕| 天天综合天天做天天综合| 久久综合久久综合九色| 欧美性大战久久久| 国内精品免费**视频| 亚洲精品亚洲人成人网在线播放| 91精品国产91久久久久久最新毛片 | 亚洲欧美在线aaa| 在线播放欧美女士性生活| 夫妻av一区二区| 日本在线不卡视频一二三区| 自拍偷拍国产精品| 久久久天堂av| 欧美顶级少妇做爰| 99久久精品国产麻豆演员表| 激情丁香综合五月| 日韩av电影免费观看高清完整版在线观看| 国产精品美女一区二区在线观看| 欧美二区在线观看| 91高清视频在线| 成人深夜福利app| 国产一区二区三区在线观看免费 | 国产日产欧美一区| 91精品国产综合久久久久久| 色视频一区二区| 国产69精品久久99不卡| 麻豆成人久久精品二区三区红| 亚洲综合激情网| 中文字幕欧美一| 国产日韩成人精品| 久久品道一品道久久精品| 日韩一区二区免费高清| 欧美精品久久一区| 亚洲黄色片在线观看| 精品视频在线看| 一本高清dvd不卡在线观看| 国产一区在线观看视频| 天天做天天摸天天爽国产一区| 最近中文字幕一区二区三区| 久久蜜桃av一区精品变态类天堂| 91精品国产手机| 欧美天堂一区二区三区| 色天使色偷偷av一区二区| 成人性生交大片免费看中文网站| 国产一区在线精品| 国产精品一区二区在线看| 麻豆精品国产91久久久久久| 日韩在线一区二区三区| 无码av中文一区二区三区桃花岛| 亚洲资源在线观看| 亚洲在线观看免费| 亚洲一区二区三区激情| 亚洲国产另类av| 亚欧色一区w666天堂| 久久66热re国产| 亚洲电影一区二区三区| 一区二区三区在线观看视频| 日本欧美大码aⅴ在线播放| 青娱乐精品视频在线| 久久精品99久久久| 国产精品白丝jk白祙喷水网站 | 中文字幕 久热精品 视频在线| 久久久99免费| 国产精品久久三区| 亚洲国产一区视频| 日本亚洲欧美天堂免费| 狠狠色2019综合网| 成人国产精品免费观看动漫| 99re视频精品| 欧美日韩免费电影| 欧美不卡一二三| 国产欧美精品一区aⅴ影院| 中文字幕日本不卡| 视频在线在亚洲| 激情伊人五月天久久综合| 成人小视频在线观看| 色天使色偷偷av一区二区| 欧美一区二区三区婷婷月色| 久久久久久久久久久99999| 亚洲色图自拍偷拍美腿丝袜制服诱惑麻豆| 亚洲最大的成人av| 美国一区二区三区在线播放| zzijzzij亚洲日本少妇熟睡| 欧美日韩中文字幕精品| 亚洲精品一区二区精华| 亚洲精品视频一区| 精品无人码麻豆乱码1区2区| av不卡在线观看| 制服.丝袜.亚洲.另类.中文| 国产欧美日韩另类一区| 亚洲.国产.中文慕字在线| 国产不卡在线播放| 欧美日韩国产在线播放网站| 久久精品欧美一区二区三区不卡 | 国产精品进线69影院| 国产精品成人免费精品自在线观看 | 欧美这里有精品| 久久综合视频网| 亚洲国产视频一区二区| 国产成人综合亚洲91猫咪| 色婷婷av一区二区三区软件 | 久久精品人人做| 日韩福利视频导航| 99视频热这里只有精品免费| 日韩欧美亚洲另类制服综合在线| 亚洲视频中文字幕| 国内精品久久久久影院薰衣草| 91福利在线观看| 国产精品视频观看| 麻豆精品国产91久久久久久| 在线区一区二视频| 中文字幕一区二区三区四区| 久久电影网站中文字幕| 欧美狂野另类xxxxoooo| 懂色av一区二区三区免费看| 欧美中文字幕一区| 中文字幕在线一区免费| 国产精品88888| 欧美一区二区成人| 香蕉久久一区二区不卡无毒影院| 99久久伊人精品| 国产精品卡一卡二卡三| 国产一区二区主播在线| 日韩欧美资源站| 三级欧美韩日大片在线看| 欧美性猛片xxxx免费看久爱| 亚洲精品免费在线| 91美女在线视频| 亚洲人成在线播放网站岛国| 粉嫩绯色av一区二区在线观看| 久久亚洲欧美国产精品乐播| 老司机精品视频导航| 欧美电影免费提供在线观看| 七七婷婷婷婷精品国产| 91精品国产福利在线观看| 日韩中文字幕不卡| 日韩丝袜美女视频| 蜜桃久久av一区| 精品国产乱码久久久久久1区2区 | 亚洲免费在线看| 色综合天天综合狠狠| 亚洲男人的天堂一区二区| 色欧美乱欧美15图片| 亚洲午夜久久久久久久久久久| 91国产丝袜在线播放| 亚洲成人av一区二区| 欧美老女人在线| 奇米精品一区二区三区在线观看一 | 欧美视频在线播放| 一区二区三区蜜桃| 欧美少妇xxx| 亚欧色一区w666天堂| 日韩欧美一级精品久久| 国产自产视频一区二区三区| 久久精品视频网| 97久久精品人人澡人人爽| 樱桃视频在线观看一区| 欧美日韩免费观看一区三区| 麻豆精品蜜桃视频网站| 国产三级精品在线| 色综合视频在线观看| 亚洲高清视频中文字幕| 欧美一区二区三区四区五区| 国产一区二区不卡在线| 亚洲色图欧美偷拍| 777欧美精品| 国产mv日韩mv欧美| 亚洲综合区在线| 久久婷婷国产综合精品青草|