示例#1
0
/*
=====================
 转发教师端数据到所有学生端
=====================
*/
bool CHandleMessage::postTeacherToAllStudent (Buf* p, enum CommandType iCommandType)
{
#if 0
    cout << "postTeacherToAllStudent ------------------------ " <<endl;
    if (p == NULL)
        return false;

    int iLen = ((MSG_HEAD*)p->ptr())->cLen;
    int iHeadLen = sizeof (MSG_HEAD);
    Buf* pbuf = NULL;

    CRoom* pc = ROOMMANAGER->get_room_by_fd (p->getfd());
    if (pc != NULL) {

        int i = 0;
        CRoom::STUDENTMAP::iterator it;
        for (it = pc->m_student_map.begin(); \
             it != pc->m_student_map.end (); ++it)
        {
            i++;
            pbuf = SINGLE->bufpool.malloc ();
            if (pbuf != NULL) {
                MSG_HEAD* head = (MSG_HEAD*)pbuf->ptr();
                head->cLen = iLen;
                head->cType = iCommandType;
                if (iLen > iHeadLen) {
                    memcpy (head->cData(), (char*)p->ptr() + iHeadLen, iLen - iHeadLen);
                }
                pbuf->setsize (head->cLen);
                pbuf->setfd (it->first);
                SINGLE->sendqueue.enqueue (pbuf);
            }
            else {
                cout << "Error: out of memory" << endl;
                p->reset();
                pbuf->reset();
                SINGLE->bufpool.free(p);
                SINGLE->bufpool.free(pbuf);
                return false;
            }
        }
        if ( 0 == i ) {
            printf("send to %d students!\n", i);
        }
    }
    else {
        cout << __FILE__ << ":" <<__FUNCTION__<< ":" << __LINE__<<"Error: not found 'teacher_fd' in Room" << endl;
        //p->reset();
        SINGLE->bufpool.free(p);
        return false;
    }

    p->reset();
    SINGLE->bufpool.free(p);
#endif
    return true;
}
示例#2
0
int main(int argc, char* argv[])
{
    int cntFd = socket(AF_INET, SOCK_STREAM, 0);
    struct sockaddr_in addr;
    addr.sin_family = AF_INET;
    addr.sin_addr.s_addr = inet_addr(SERV_IP);
    addr.sin_port = htons(SERV_PORT);

    connect(cntFd, (struct sockaddr*)&addr, sizeof(struct sockaddr));
    char buf[MAX_BUF_SIZE] = {0};

    // send CT_Login
    (void) memset (buf, 0x00, MAX_BUF_SIZE);
    MSG_HEAD* head = (MSG_HEAD*) buf;
    head->cLen = MSG_HEAD_LEN;
    head->cType = CT_Login;
    send_v (cntFd, buf, head->cLen);

    // send CT_GetVersion
    (void) memset (buf, 0x00, MAX_BUF_SIZE);
    version v;
    v.set_ver ("v1.2");
    string  s_version;
    v.SerializeToString (&s_version);
    head = (MSG_HEAD*) buf;
    head->cLen = MSG_HEAD_LEN + s_version.size ();
    head->cType = CT_GetVersion;
    (void) memcpy (head->cData(), s_version.c_str (), s_version.size ());
    send_v (cntFd, buf, head->cLen);

    // send CT_GetUpdateContent
    (void) memset (buf, 0x00, MAX_BUF_SIZE);
    head = (MSG_HEAD*) buf;
    head->cLen = MSG_HEAD_LEN;
    head->cType = CT_GetUpdateContent;
    send_v (cntFd, buf, head->cLen);
#if 1
    updatecontent update;
    (void) memset (buf, 0x00, MAX_BUF_SIZE);
    recv_v (cntFd, buf, MSG_HEAD_LEN);
    unsigned int recv_len = *(int*) ((char*)buf);
    recv_v (cntFd, buf, recv_len-MSG_HEAD_LEN);
    s_version = buf;
    update.ParseFromString (s_version);
    cout << "xml content is:\n" << update.xmlcontent () << "" << endl;
#endif

    if (cntFd) close (cntFd);
    return 0;
}
示例#3
0
/*
=====================
 控场级别 (教师端)
 显示控场动画级别 (白板端)
=====================
*/
void CHandleMessage::handleControlLevel (Buf* p)
{
#ifdef _EXECUTE_
    if (p == NULL)
        return;

    cout << "process: CT_ControlLevel" << endl;
    MSG_HEAD* head = (MSG_HEAD*)p->ptr();
    cout<<"level : " <<*(int*)head->cData() <<endl;

    if (head->cType == CT_ControlLevel) {
        CHandleMessage::postTeacherToWhite (p, ST_ControlLevel);
    }

    return;
#endif
}
示例#4
0
void CHandleMessage::handleGetUpdateContent (Buf* p)
{
    cout << "CT_GetUpdateContent" << endl;

    if (p == NULL)
        return;

    MSG_HEAD* head = (MSG_HEAD*) p->ptr ();
    head->cLen = sizeof (MSG_HEAD);
    head->cType = ST_GetUpdateContent;

    updatecontent update;

    int ffd, nread = 0;
    string fcontent;
    char buffer[MAX_BUFF_SIZE];
    if ((ffd = open ("outoutout.xml", O_RDONLY)) < 0)
    {
        perror ("open outoutout.xml");
        p->reset ();
        SINGLE->bufpool.free (p);
    }
    (void) memset (buffer, 0x00, sizeof (buffer));
    while ((nread = read (ffd, &buffer[0], MAX_BUFF_SIZE)) > 0)
    {
        string tmpStr = buffer;
        fcontent += tmpStr;
        (void) memset (buffer, 0x00, sizeof (buffer));
        
    }

    cout << fcontent.c_str() << endl;
    update.set_xmlcontent (fcontent.c_str());

    string  s_update;
    update.SerializeToString (&s_update);

    (void) memcpy (head->cData(), s_update.c_str(), s_update.size ());
    head->cLen += s_update.size ();
    
    p->setsize (head->cLen);
    SINGLE->sendqueue.enqueue (p);
}
示例#5
0
void CHandleMessage::handleGetVersion (Buf* p)
{
    cout << "CT_Version" << endl;

    if (p == NULL)
        return;

    MSG_HEAD* head = (MSG_HEAD*) p->ptr ();
    head->cLen = sizeof (MSG_HEAD);
    head->cType = ST_GetVersion;

    version v;

    string recvstr ((char*) head->cData ());
    v.ParseFromString (recvstr);

    cout << v.ver() << endl;

    p->reset ();
    SINGLE->bufpool.free (p);
}
示例#6
0
/*
=====================
 获得数据库表纪录数量
=====================
*/
bool CHandleMessage::postDBRecordCount (Buf* p, int iCase)
{
#if 0
    char str[1024] = "SELECT count(*) AS ccount FROM ";

    if (NULL == p) {
        printf("null buf\n");
        return false;
    }
    //printf (" postDBRecordCount ..., iCase=%d\n", iCase);
#if 1
    if (iCase == 1) {
        strcat (str, "course_group_course AS cgc, course_group AS cg, course AS c, grade AS g, grade_course AS gc WHERE  cgc.group_id = cg.group_id AND cgc.course_id = c.course_id AND gc.grade_id = g.grade_id AND c.course_id = gc.course_id");
    }
    else if (iCase == 2) {
        strcat (str, "grade");
    }
    else if (iCase == 3) {
        strcat (str, "class");
    }
    else if (iCase == 4) {
        strcat (str, "classroom");
    }
    else if (iCase == 5) {
        strcat (str, "student");
    }
    else if (iCase == 6) {
        //strcat (str, "course_item AS ci, course AS c, item AS i WHERE ci.course_id=c.course_id AND ci.item_id=i.item_id AND c.course_name=?");
        strcat (str, "course_item AS ci, course AS c, item AS i WHERE ci.course_id=c.course_id AND ci.item_id=i.item_id AND (c.course_name=? OR c.course_name=? OR c.course_name=? OR c.course_name=?)");
    }
#endif

    // dbCount.count = 100;
    //
#if 0
    struct sDBCount dbCount;
    dbCount.count = 5;
    MSG_HEAD *head = (MSG_HEAD*) buf->ptr();
    head->cLen = sizeof (MSG_HEAD) + sizeof (dbCount);
    head->cType = CT_GetClassRoomDBCount;
    memcpy (head->cData(), &dbCount, sizeof (dbCount));

    buf->setsize (head->cLen);
    SINGLE->sendqueue.enqueue (buf);
#endif
#if 1

    try {
        MutexLockGuard guard(DATABASE->m_mutex);
        PreparedStatement* pstmt = DATABASE->preStatement(str);
        if (iCase == 6) {
        #if 0 // fixed: to update
            sGetCourseItem* ci = (sGetCourseItem *) ((char*)((MSG_HEAD*)p->ptr()) + sizeof (MSG_HEAD));
            pstmt->setString (1, ci->sCourseName);
        #else
#ifdef _TEACHER_NOLOGIN
            // only for h**king test............
            pstmt->setString (1, "拼图");
            pstmt->setString (2, "造房子");
            pstmt->setString (3, "暖身操");
            pstmt->setString (4, "动画片");
#else
            CRoom* room = ROOMMANAGER->get_room_by_fd (p->getfd());
            if (room != NULL)
            {
                CRoom::COURSELIST::iterator it;
                int ii = 1;
                for (it = room->m_course_list.begin (); it != room->m_course_list.end (); ++it) {
                    pstmt->setString (ii++, (*it)->getName());
                    cout << "COURSE NAME: " << (*it)->getName() << endl;
                }
            }
#endif
        #endif
        }
        ResultSet* prst = pstmt->executeQuery ();
        while (prst->next ()) {
            struct sDBCount dbCount;
            dbCount.count = prst->getInt ("ccount");
            printf ("get db count: %d\n", dbCount.count);
            MSG_HEAD* head = (MSG_HEAD*)p->ptr();
            head->cLen = MSG_HEAD_LEN + sizeof (dbCount);

            if (iCase == 1)
                head->cType = CT_GetCourseDBCount;
            else if (iCase == 2)
                head->cType = CT_GetGradeDBCount;
            else if (iCase == 3)
                head->cType = CT_GetClassDBCount;
            else if (iCase == 4)
                head->cType = CT_GetClassRoomDBCount;
            else if (iCase == 5)
                head->cType = CT_GetAllStudentInfoCount;
            else if (iCase == 6)
                head->cType = CT_GetCourseItemCount;

            //memcpy (head->cData(), &dbCount, sizeof (dbCount));
            memcpy ((char *)p->ptr() + MSG_HEAD_LEN, &dbCount, sizeof (struct sDBCount));

            p->setsize (head->cLen);
            SINGLE->sendqueue.enqueue (p);
        }
        delete pstmt;
        delete prst;
    }
    catch (SQLException e) {
        printf ("%s\n", e.what ());
    }
#endif
#endif
    return true;
}
示例#7
0
int SendTask::work() {
    while(true){
        Buf* p = NULL;
        if (0 != SINGLE->sendqueue.dequeue(p, 3)) {
            continue;
        }

        int fd = p->getfd();

        if (0 == fd) {
            printf(" fd = 0 !\n");
            continue;
        }

#if 0
        MSG_HEAD* pp = (MSG_HEAD*)p->ptr();
        if ( pp->cType > 9999 ) {
            struct sGetAllStudentInfo* xxx = (struct sGetAllStudentInfo*)pp->cData();
            printf("id %d pic %s  --  len:=%d\n", xxx->iStudentId, xxx->sPicName, pp->cLen);

        }

        unsigned int len = 0;
        int cnt;
        while (len < p->size()) {
            cnt = send(fd, (char *)p->ptr() + len, p->size() - len, 0);
            if (cnt == -1) {
                cout << "send erroooooooooooooooooooooor" << endl;
                break;
            }
            len += cnt;
        }

        printf ("ERRNO: %d, message:%s len = %d, p->size() = %ld\n", errno, strerror (errno), len ,p->size());
#else
        int bytes_left = p->size ();
        int written_bytes;
        char* ptr = (char*) p->ptr();
        while (bytes_left > 0)
        {
            written_bytes = send (fd, ptr, bytes_left, 0);
            if (written_bytes <= 0) {
                if (errno == EINTR) {
                    if (written_bytes < 0) written_bytes = 0;
                    continue;
                }
                else if (errno == EAGAIN) {
                    if (written_bytes < 0) written_bytes = 0;
                    sleep (1);
                    continue;
                }
                else
                    break;
            }
            bytes_left -= written_bytes;
            ptr += written_bytes;
        }
#endif
        printf("Send data...finished. packetLength=%ld, from FD=[%d]\n", p->size(), fd);

        p->reset();
        SINGLE->bufpool.free(p);
    }
    return 0;
}