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

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

?? csocketrtscheduler.cpp

?? good examples for omnet++
?? CPP
字號(hào):
//=========================================================================
//  CSOCKETRTSCHEDULER.CC - part of
//
//                  OMNeT++/OMNEST
//           Discrete System Simulation in C++
//
//   Written by:  Andras Varga, 2005
//
//=========================================================================

/*--------------------------------------------------------------*
  Copyright (C) 2005 Andras Varga

  This file is distributed WITHOUT ANY WARRANTY. See the file
  `license' for details on this and other legal matters.
*--------------------------------------------------------------*/


#include "csocketrtscheduler.h"

Register_Class(cSocketRTScheduler);


inline std::ostream& operator<<(std::ostream& ev, const timeval& tv)
{
    return ev << (unsigned long)tv.tv_sec << "s" << tv.tv_usec << "us";
}

//---

cSocketRTScheduler::cSocketRTScheduler() : cScheduler()
{
    listenerSocket = INVALID_SOCKET;
    connSocket = INVALID_SOCKET;
}

cSocketRTScheduler::~cSocketRTScheduler()
{
}

void cSocketRTScheduler::startRun()
{
    if (initsocketlibonce()!=0)
        throw new cRuntimeError("cSocketRTScheduler: Cannot initialize socket library");

    gettimeofday(&baseTime, NULL);

    module = NULL;
    notificationMsg = NULL;
    recvBuffer = NULL;
    recvBufferSize = 0;
    numBytesPtr = NULL;

    port = ev.config()->getAsInt("General", "socketrtscheduler-port", 4242);
    setupListener();
}

void cSocketRTScheduler::setupListener()
{
    listenerSocket = socket(AF_INET, SOCK_STREAM, 0);
    if (listenerSocket==INVALID_SOCKET)
        throw new cRuntimeError("cSocketRTScheduler: cannot create socket");

    sockaddr_in sinInterface;
    sinInterface.sin_family = AF_INET;
    sinInterface.sin_addr.s_addr = INADDR_ANY;
    sinInterface.sin_port = htons(port);
    if (bind(listenerSocket, (sockaddr*)&sinInterface, sizeof(sockaddr_in))==SOCKET_ERROR)
        throw new cRuntimeError("cSocketRTScheduler: socket bind() failed");

    listen(listenerSocket, SOMAXCONN);
}

void cSocketRTScheduler::endRun()
{
}

void cSocketRTScheduler::executionResumed()
{
    gettimeofday(&baseTime, NULL);
    baseTime = timeval_substract(baseTime, sim->simTime());
}

void cSocketRTScheduler::setInterfaceModule(cModule *mod, cMessage *notifMsg, char *buf, int bufSize, int *nBytesPtr)
{
    if (module)
        throw new cRuntimeError("cSocketRTScheduler: setInterfaceModule() already called");
    if (!mod || !notifMsg || !buf || !bufSize || !nBytesPtr)
        throw new cRuntimeError("cSocketRTScheduler: setInterfaceModule(): arguments must be non-NULL");

    module = mod;
    notificationMsg = notifMsg;
    recvBuffer = buf;
    recvBufferSize = bufSize;
    numBytesPtr = nBytesPtr;
    *numBytesPtr = 0;
}

bool cSocketRTScheduler::receiveWithTimeout(long usec)
{
    // prepare sets for select()
    fd_set readFDs, writeFDs, exceptFDs;
    FD_ZERO(&readFDs);
    FD_ZERO(&writeFDs);
    FD_ZERO(&exceptFDs);

    // if we're connected, watch connSocket, otherwise accept new connections
    if (connSocket!=INVALID_SOCKET)
        FD_SET(connSocket, &readFDs);
    else
        FD_SET(listenerSocket, &readFDs);

    timeval timeout;
    timeout.tv_sec = 0;
    timeout.tv_usec = usec;

    if (select(FD_SETSIZE, &readFDs, &writeFDs, &exceptFDs, &timeout) > 0)
    {
        // Something happened on one of the sockets -- handle them
        if (connSocket!=INVALID_SOCKET && FD_ISSET(connSocket, &readFDs))
        {
            // receive from connSocket
            char *bufPtr = recvBuffer + (*numBytesPtr);
            int bufLeft = recvBufferSize - (*numBytesPtr);
            if (bufLeft<=0)
                throw new cRuntimeError("cSocketRTScheduler: interface module's recvBuffer is full");
            int nBytes = recv(connSocket, bufPtr, bufLeft, 0);
            if (nBytes==SOCKET_ERROR)
            {
                ev << "cSocketRTScheduler: socket error " << sock_errno() << "\n";
                closesocket(connSocket);
                connSocket = INVALID_SOCKET;
            }
            else if (nBytes == 0)
            {
                ev << "cSocketRTScheduler: socket closed by the client\n";
                if (shutdown(connSocket, SHUT_WR) == SOCKET_ERROR)
                    throw new cRuntimeError("cSocketRTScheduler: shutdown() failed");
                closesocket(connSocket);
                connSocket = INVALID_SOCKET;
            }
            else
            {
                // schedule notificationMsg for the interface module
                ev << "cSocketRTScheduler: received " << nBytes << " bytes\n";
                (*numBytesPtr) += nBytes;

                timeval curTime;
                gettimeofday(&curTime, NULL);
                curTime = timeval_substract(curTime, baseTime);
                simtime_t t = curTime.tv_sec + curTime.tv_usec*1e-6;
                // TBD assert that it's somehow not smaller than previous event's time
                notificationMsg->setArrival(module,-1,t);
                simulation.msgQueue.insert(notificationMsg);
                return true;
            }
        }
        else if (FD_ISSET(listenerSocket, &readFDs))
        {
            // accept connection, and store FD in connSocket
            sockaddr_in sinRemote;
            int addrSize = sizeof(sinRemote);
            connSocket = accept(listenerSocket, (sockaddr*)&sinRemote, (socklen_t*)&addrSize);
            if (connSocket==INVALID_SOCKET)
                throw new cRuntimeError("cSocketRTScheduler: accept() failed");
            ev << "cSocketRTScheduler: connected!\n";
        }
    }
    return false;
}

int cSocketRTScheduler::receiveUntil(const timeval& targetTime)
{
    // if there's more than 200ms to wait, wait in 100ms chunks
    // in order to keep UI responsiveness by invoking ev.idle()
    timeval curTime;
    gettimeofday(&curTime, NULL);
    while (targetTime.tv_sec-curTime.tv_sec >=2 ||
           timeval_diff_usec(targetTime, curTime) >= 200000)
    {
        if (receiveWithTimeout(100000)) // 100ms
            return 1;
        if (ev.idle())
            return -1;
        gettimeofday(&curTime, NULL);
    }

    // difference is now at most 100ms, do it at once
    long usec = timeval_diff_usec(targetTime, curTime);
    if (usec>0)
        if (receiveWithTimeout(usec))
            return 1;
    return 0;
}

cMessage *cSocketRTScheduler::getNextEvent()
{
    // assert that we've been configured
    if (!module)
        throw new cRuntimeError("cSocketRTScheduler: setInterfaceModule() not called: it must be called from a module's initialize() function");

    // calculate target time
    timeval targetTime;
    cMessage *msg = sim->msgQueue.peekFirst();
    if (!msg)
    {
        // if there are no events, wait until something comes from outside
        // TBD: obey simtimelimit, cpu-time-limit
        targetTime.tv_sec = LONG_MAX;
        targetTime.tv_usec = 0;
    }
    else
    {
        // use time of next event
        simtime_t eventSimtime = msg->arrivalTime();
        targetTime = timeval_add(baseTime, eventSimtime);
    }

    // if needed, wait until that time arrives
    timeval curTime;
    gettimeofday(&curTime, NULL);
    if (timeval_greater(targetTime, curTime))
    {
        int status = receiveUntil(targetTime);
        if (status == -1)
            return NULL; // interrupted by user
        if (status == 1)
            msg = sim->msgQueue.peekFirst(); // received something
    }
    else
    {
        // we're behind -- customized versions of this class may
        // alert if we're too much behind, whatever that means
    }

    // ok, return the message
    return msg;
}

void cSocketRTScheduler::sendBytes(const char *buf, size_t numBytes)
{
    if (connSocket==INVALID_SOCKET)
        throw new cRuntimeError("cSocketRTScheduler: sendBytes(): no connection");

    send(connSocket, buf, numBytes, 0);
    // TBD check for errors
}

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产一区 二区 三区一级| 日本系列欧美系列| 欧美蜜桃一区二区三区| 日韩精品一级中文字幕精品视频免费观看| 欧美日韩国产综合草草| 国产乱码一区二区三区| 综合欧美亚洲日本| 91麻豆精品久久久久蜜臀| 丝袜国产日韩另类美女| 国产日韩高清在线| 欧美日韩视频第一区| 国产精品自拍毛片| 亚洲chinese男男1069| 26uuu色噜噜精品一区| 色香蕉成人二区免费| 亚洲黄一区二区三区| 精品粉嫩超白一线天av| 久久久久国产精品厨房| 欧美亚洲免费在线一区| 国产精品影视在线| 亚洲成人手机在线| 国产精品伦理一区二区| 91精品黄色片免费大全| 高清免费成人av| 日韩av在线发布| 综合在线观看色| 精品国产乱码久久久久久影片| caoporn国产精品| 韩国三级中文字幕hd久久精品| 一区二区三区四区蜜桃| 国产欧美一二三区| 欧美日韩综合一区| 成人sese在线| 韩国精品在线观看| 亚洲一区二区四区蜜桃| 成人免费在线观看入口| 久久久亚洲午夜电影| 欧美人与禽zozo性伦| 91免费版在线| 成人午夜激情视频| 精品一区二区三区免费播放| 国产精品麻豆视频| 精品国产乱码久久久久久蜜臀| 欧美色图片你懂的| 色婷婷综合激情| 春色校园综合激情亚洲| 国产盗摄女厕一区二区三区| 久久电影网电视剧免费观看| 国产精品国产三级国产普通话蜜臀 | 一本久久综合亚洲鲁鲁五月天| 久久精品国产亚洲高清剧情介绍 | 欧美tickling网站挠脚心| 欧美色区777第一页| 91丝袜美女网| 成人美女在线观看| 粉嫩av一区二区三区在线播放| 寂寞少妇一区二区三区| 久久精品72免费观看| 麻豆高清免费国产一区| 日韩电影在线观看网站| 国产精品国模大尺度视频| 国产欧美日韩精品a在线观看| 久久久久久夜精品精品免费| 精品日韩一区二区三区| 日韩欧美国产一区二区在线播放| 欧美日韩综合不卡| 欧美高清www午色夜在线视频| 欧美三级日韩三级| 欧美久久婷婷综合色| 91精品欧美一区二区三区综合在| 国产人成亚洲第一网站在线播放| 久久久久久夜精品精品免费| 久久久久国产精品人| 日韩欧美在线网站| 欧美一区二区三区在线看| 日韩女优毛片在线| 久久天堂av综合合色蜜桃网| 久久久天堂av| 国产精品久久久久婷婷二区次| 国产精品久久久久久久久免费桃花 | 在线播放日韩导航| 欧美视频在线观看一区| 91精品国产欧美一区二区18| 日韩精品一区二区三区三区免费| 在线成人av影院| 欧美精品一区二| 亚洲国产精品高清| 一区二区在线观看视频| 日韩在线观看一区二区| 日本美女一区二区三区| 国产乱对白刺激视频不卡| a亚洲天堂av| 色综合天天综合| 在线不卡a资源高清| 久久久久久久久久久99999| 日韩久久一区二区| 日韩精彩视频在线观看| 国产ts人妖一区二区| 91麻豆自制传媒国产之光| 777色狠狠一区二区三区| 久久天堂av综合合色蜜桃网| 亚洲欧美另类在线| 免费观看成人鲁鲁鲁鲁鲁视频| 韩国av一区二区三区四区 | 国产精品538一区二区在线| 99视频热这里只有精品免费| 欧美亚洲综合网| 欧美男同性恋视频网站| 欧美精品一二三四| 日本一区二区电影| 日本在线观看不卡视频| 色综合久久66| 亚洲欧美日韩在线| 成人毛片视频在线观看| 久久久亚洲综合| 久久99精品一区二区三区| 欧美精品丝袜中出| 亚洲精品国产一区二区三区四区在线| 国产在线播放一区三区四| 91精品欧美福利在线观看| 亚洲成人黄色影院| 在线视频国产一区| 自拍偷拍欧美精品| 99久久精品国产导航| 国产亚洲精品资源在线26u| 精品一区二区成人精品| 欧美一区二区三区日韩视频| 亚洲伊人色欲综合网| 一本到三区不卡视频| 中文字幕巨乱亚洲| 国产伦精品一区二区三区在线观看| 日韩欧美一区二区久久婷婷| 首页欧美精品中文字幕| 欧美性极品少妇| 香蕉久久一区二区不卡无毒影院| 欧美午夜精品一区二区蜜桃| 亚洲影院在线观看| 欧美日韩综合色| 午夜亚洲福利老司机| 欧美丰满嫩嫩电影| 老司机午夜精品| 精品99999| 国产精品亚洲综合一区在线观看| 久久亚洲精精品中文字幕早川悠里 | 99久久精品久久久久久清纯| 中文字幕精品综合| 91在线看国产| 一区二区三区久久| 欧美人体做爰大胆视频| 日韩高清在线一区| 精品国精品自拍自在线| 国产成人综合亚洲网站| 中文字幕永久在线不卡| 色综合咪咪久久| 午夜精品123| 欧美精品一区二区精品网| 国产suv精品一区二区883| 亚洲欧美日韩中文字幕一区二区三区| 欧洲人成人精品| 蜜桃av一区二区| 国产女人aaa级久久久级| 99精品久久只有精品| 亚洲一本大道在线| 日韩你懂的电影在线观看| 成人一级片在线观看| 亚洲最快最全在线视频| 欧美一级专区免费大片| 国产不卡免费视频| 亚洲国产精品天堂| 精品国产91乱码一区二区三区| 成人午夜又粗又硬又大| 洋洋av久久久久久久一区| 精品伦理精品一区| 91香蕉视频在线| 丝袜亚洲另类丝袜在线| 国产清纯白嫩初高生在线观看91 | 成人免费电影视频| 婷婷久久综合九色综合伊人色| 精品99999| 在线影院国内精品| 国产精品影视在线| 亚洲3atv精品一区二区三区| 国产亚洲欧美在线| 欧美日本一道本在线视频| 国产精品99久久久久久似苏梦涵 | 欧美一级一区二区| 成人sese在线| 麻豆成人久久精品二区三区小说| 国产精品情趣视频| 欧美一区二区三区在线看| 波多野结衣视频一区| 日韩不卡免费视频| 1024亚洲合集| 欧美本精品男人aⅴ天堂| av电影一区二区| 久久精品国产一区二区三区免费看| 亚洲女性喷水在线观看一区| 欧美α欧美αv大片| 欧美亚洲精品一区| va亚洲va日韩不卡在线观看|