/* ===================== 转发教师端数据到所有学生端 ===================== */ 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; }
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; }
/* ===================== 控场级别 (教师端) 显示控场动画级别 (白板端) ===================== */ 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 }
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); }
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); }
/* ===================== 获得数据库表纪录数量 ===================== */ 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; }
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; }