/** * 向好友请求文件数据. * @param sock tcp socket * @param pal class PalInfo * @param packetno 好友消息的包编号 * @param fileid 文件ID标识 * @param offset 文件偏移量 * @return 消息发送成功与否 */ bool Command::SendAskData(int sock, PalInfo *pal, uint32_t packetno, uint32_t fileid, int64_t offset) { char attrstr[35]; //8+1+8+1+16 +1 =35 struct sockaddr_in addr; char *iptuxstr = "iptux"; snprintf(attrstr, 35, "%" PRIx32 ":%" PRIx32 ":%" PRIx64, packetno, fileid, offset); //IPMSG和Feiq的命令字段都是只有IPMSG_GETFILEDATA,使用(IPMSG_FILEATTACHOPT | IPMSG_GETFILEDATA) //会产生一些潜在的不兼容问题,所以在发往非iptux时只使用IPMSG_GETFILEDATA if(strstr(pal->version,iptuxstr)) CreateCommand(IPMSG_FILEATTACHOPT | IPMSG_GETFILEDATA, attrstr); else CreateCommand(IPMSG_GETFILEDATA, attrstr); ConvertEncode(pal->encode); bzero(&addr, sizeof(addr)); addr.sin_family = AF_INET; addr.sin_port = htons(IPTUX_DEFAULT_PORT); addr.sin_addr.s_addr = pal->ipv4; if (((connect(sock, (struct sockaddr *)&addr, sizeof(addr)) == -1) && (errno != EINTR)) || (xwrite(sock, buf, size) == -1)) return false; return true; }
// Called when the render is available bool j1Console::Start() { LOG("Creating Console UI"); bool ret = true; // load font --- font = App->font->Load("fonts/ubuntu/UbuntuMono-R.ttf", 14); // Setup gui --- text = App->gui->CreateLabel(" ", font); text->SetVisible(showing); text->interactive = true; text->drag = {0, 1}; text->modal = true; input = App->gui->CreateInput(">", App->render->camera.w, {0, 0}); input->interactive = true; input->can_focus = true; input->SetLocalPos(LEFT_MARGIN, int(App->render->camera.h * CONSOLE_HEIGHT)); input->SetListener(this); input->modal = true; input->SetVisible(showing); // Create some default commands quit = CreateCommand("quit", this); list = CreateCommand("list", this); return ret; }
INT InitPV3(void) { if (CreateCommand("pv3scal", pv3ScalCommand) == NULL) return __LINE__; if (CreateCommand("pv3vect", pv3VectCommand) == NULL) return __LINE__; if (CreateCommand("pv3plot", pv3PlotCommand) == NULL) return __LINE__; return 0; }
void MMatchClient::SendCommandByTunneling(MCommand* pCommand) { if (GetAllowTunneling() == false) { } else { if (GetBridgePeerFlag() == false) { MCommand* pCmd = CreateCommand(MC_AGENT_TUNNELING_TCP, GetAgentServerUID()); pCmd->AddParameter(new MCmdParamUID(GetPlayerUID())); pCmd->AddParameter(new MCmdParamUID(pCommand->GetReceiverUID())); // Create Param : Command Blob //// if (!MakeTunnelingCommandBlob(pCmd, pCommand)) { delete pCmd; pCmd=NULL; return; } /////////////////////////////////// SendCommandToAgent(pCmd); delete pCmd; // PACKETQUEUE 만들때까지 delete 임시로 사용 } else { MCommand* pCmd = CreateCommand(MC_AGENT_TUNNELING_UDP, GetAgentServerUID()); pCmd->AddParameter(new MCmdParamUID(GetPlayerUID())); pCmd->AddParameter(new MCmdParamUID(pCommand->GetReceiverUID())); // Create Param : Command Blob //// if (!MakeTunnelingCommandBlob(pCmd, pCommand)) { delete pCmd; pCmd=NULL; return; } /////////////////////////////////// SendCommandByUDP(pCmd, GetAgentIP(), GetAgentPeerPort()); delete pCmd; // PACKETQUEUE 만들때까지 delete 임시로 사용 } } }
bool MBMatchServer::AddClanServerSwitchDownSchedule() { int a = 0; MCommand* pCmd = CreateCommand( MC_MATCH_SCHEDULE_CLAN_SERVER_SWITCH_DOWN, MUID(0, 0) ); if( 0 == pCmd ) return false; tm t; MMatchGetLocalTime(&t); MMatchScheduleData* pScheduleData = m_pScheduler->MakeOnceScheduleData( t.tm_year - 100, t.tm_mon + 1, GetMaxDay(), 23, 50, pCmd ); if( 0 == pScheduleData ){ delete pCmd; return false; } if( !m_pScheduler->AddDynamicSchedule(pScheduleData) ){ delete pCmd; delete pScheduleData; return false; } mlog( "MBMatchServer::AddClanServerSwitchDownSchedule - 클랜서버다운 커맨드 생성 성공. 다음실행시간:%d년%d월%d일 %d시%d분\n", pScheduleData->GetYear(), pScheduleData->GetMonth(), pScheduleData->GetDay(), pScheduleData->GetHour(), pScheduleData->GetMin() ); return true; }
void MMatchServer::OnAdminRequestBlockPlayer(const MUID& uidAdmin, const char* szPlayer, const int nPenaltyHour) { MMatchObject* pObj = GetObject(uidAdmin); if (pObj == NULL) return; if (!IsAdminGrade(pObj)) return; if ((strlen(szPlayer)) < 2) return; int nRet = MOK; MMatchObject* pTargetObj = GetPlayerByName(szPlayer); if (pTargetObj != NULL) { pTargetObj->GetAccountPenaltyInfo()->SetPenaltyInfo(MPC_CONNECT_BLOCK, nPenaltyHour); const MPenaltyInfo* pPenaltyInfo = pTargetObj->GetAccountPenaltyInfo()->GetPenaltyInfo(MPC_CONNECT_BLOCK); if( m_MatchDBMgr.InsertAccountPenaltyInfo(pTargetObj->GetAccountInfo()->m_nAID , pPenaltyInfo->nPenaltyCode, nPenaltyHour, pObj->GetAccountName()) == false ) { pTargetObj->GetAccountPenaltyInfo()->ClearPenaltyInfo(MPC_CONNECT_BLOCK); nRet = MERR_ADNIN_CANNOT_PENALTY_ON_DB; } } else { nRet = MERR_ADMIN_NO_TARGET; } MCommand* pNew = CreateCommand(MC_ADMIN_RESPONSE_BLOCK_PLAYER, MUID(0,0)); pNew->AddParameter(new MCmdParamInt(nRet)); if( nRet == MOK ) { Disconnect(pTargetObj->GetUID()); } RouteToListener(pObj, pNew); }
bool CClientDB::InsertInventoryData( const char* pszName, S_InventoryData Data ) { ICommandText* pICommandText = NULL; HRESULT hr; LONG cNumRows = 0; WCHAR wCmdString[1024]; wsprintfW(wCmdString, L"INSERT INTO INVENTORY ( name, realindex, virtualindex ) VALUES ( '%S', %d, %d )", pszName, Data.lRealIndex, Data.lVirtualIndex ); pICommandText = CreateCommand ( m_pIDBInitialize ,wCmdString ); if( pICommandText == NULL ) return false; if(FAILED(hr = pICommandText->Execute( NULL, IID_NULL, NULL, &cNumRows, NULL))) { LogString( LOG_NORMAL,"Fail CreateInventoryTable\n" ); } pICommandText->Release(); return true; }
void MMatchServer::OnAsyncInsertEvent( MAsyncJob* pJobResult ) { if( 0 == pJobResult ) return; MAsyncDBJob_EventLog* pEventJob = reinterpret_cast< MAsyncDBJob_EventLog* >( pJobResult ); if( pEventJob->GetAnnounce().empty() ) return; if( MASYNC_RESULT_SUCCEED == pJobResult->GetResult() ) { MCommand* pCmd; AsyncEventObjVec::const_iterator it, end; const AsyncEventObjVec& EventObjList = pEventJob->GetEventObjList(); end = EventObjList.end(); for( it = EventObjList.begin(); it != end; ++it ) { if( MUID(0, 0) != it->uidUser ) { pCmd = CreateCommand( MC_MATCH_ANNOUNCE, it->uidUser ); if( 0 != pCmd ) { pCmd->AddParameter( new MCmdParamUInt(0) ); pCmd->AddParameter( new MCmdParamStr(pEventJob->GetAnnounce().c_str()) ); Post( pCmd ); } } } } }
//*---------------------------------------------------------------------------- /// 매번 새로 만들려고 시도한다.. 이미 만들어져 있다면 Fail //*---------------------------------------------------------------------------- bool CClientDB::CreateInventoryTable() { ICommandText* pICommandText = NULL; HRESULT hr; LONG cNumRows = 0; WCHAR wCmdString[] = L"CREATE TABLE INVENTORY ( name TEXT(30), realindex long , virtualindex long )"; pICommandText = CreateCommand ( m_pIDBInitialize ,wCmdString ); if( pICommandText == NULL ) return false; if(FAILED(hr = pICommandText->Execute( NULL, IID_NULL, NULL, &cNumRows, NULL))) { LogString( LOG_NORMAL,"Fail CreateInventoryTable\n" ); } pICommandText->Release(); return true; }
void MMatchServer::OnAsyncBuyQuestItem( MAsyncJob* pJobReslt ) { MAsyncDBJob_BuyQuestItem* pJob = (MAsyncDBJob_BuyQuestItem*)pJobReslt; if( MASYNC_RESULT_SUCCEED != pJob->GetResult() ){ return; } MMatchObject* pPlayer = GetObject( pJob->GetPlayerUID() ); if( NULL == pPlayer ) { return; } MMatchCharInfo* pCharInfo = pPlayer->GetCharInfo(); if( NULL == pCharInfo ) { return; } // 아이템 거래 카운트 증가. 내부에서 디비 업데이트 결정. pCharInfo->GetDBQuestCachingData().IncreaseShopTradeCount(pJob->GetItemCount()); pCharInfo->m_nBP -= pJob->GetPrice(); MCommand* pNewCmd = CreateCommand( MC_MATCH_RESPONSE_BUY_QUEST_ITEM, pJob->GetPlayerUID() ); if( 0 == pNewCmd ) { mlog( "MMatchServer::OnResponseBuyQuestItem - new Command실패.\n" ); return; } pNewCmd->AddParameter( new MCmdParamInt(MOK) ); pNewCmd->AddParameter( new MCmdParamInt(pCharInfo->m_nBP) ); PostSafeQueue( pNewCmd ); // 퀘스트 아이템 리스트를 다시 전송함. OnRequestCharQuestItemList( pJob->GetPlayerUID() ); }
/** * 给好友发送消息. * @param sock udp socket * @param pal class PalInfo * @param msg 消息数据 */ void Command::SendMessage(int sock, PalInfo *pal, const char *msg) { struct sockaddr_in addr; uint32_t packetno; uint8_t count; pal->rpacketn = packetno = packetn; //此数据包需要检验回复 CreateCommand(IPMSG_SENDCHECKOPT | IPMSG_SENDMSG, msg); ConvertEncode(pal->encode); bzero(&addr, sizeof(addr)); addr.sin_family = AF_INET; addr.sin_port = htons(IPTUX_DEFAULT_PORT); addr.sin_addr.s_addr = pal->ipv4; count = 0; do { sendto(sock, buf, size, 0, (struct sockaddr *)&addr, sizeof(addr)); g_usleep(1000000); count++; } while (pal->rpacketn == packetno && count < MAX_RETRYTIMES); if (pal->rpacketn == packetno) FeedbackError(pal, GROUP_BELONG_TYPE_REGULAR, _("Your pal didn't receive the packet. " "He or she is offline maybe.")); }
bool CClientDB::UpdateInventoryData( const char* pszName, S_InventoryData Data ) { ICommandText* pICommandText = NULL; HRESULT hr; LONG cNumRows = 0; WCHAR wCmdString[1024]; wsprintfW(wCmdString, L"UPDATE INVENTORY SET virtualindex = %d WHERE name = '%S' AND realindex = %d",Data.lVirtualIndex , pszName ,Data.lRealIndex ); pICommandText = CreateCommand ( m_pIDBInitialize ,wCmdString ); if( pICommandText == NULL ) return false; if(FAILED(hr = pICommandText->Execute( NULL, IID_NULL, NULL, &cNumRows, NULL))) { LogString( LOG_NORMAL,"Fail CreateInventoryTable\n" ); pICommandText->Release(); return false; } pICommandText->Release(); if( cNumRows == 0 ) return false; return true; }
MCommand* MMatchServer::CreateCmdMatchResponseLoginFailed(const MUID& uidComm, const int nResult) { MCommand* pCmd = CreateCommand(MC_MATCH_RESPONSE_LOGIN, uidComm); pCmd->AddParameter(new MCommandParameterInt(nResult)); pCmd->AddParameter(new MCommandParameterString(MGetServerConfig()->GetServerName())); pCmd->AddParameter(new MCommandParameterChar((char)MGetServerConfig()->GetServerMode())); pCmd->AddParameter(new MCommandParameterString("Ana")); pCmd->AddParameter(new MCommandParameterUChar((unsigned char)MMUG_FREE)); pCmd->AddParameter(new MCommandParameterInt((int)MMPG_FREE)); pCmd->AddParameter(new MCommandParameterInt(0)); pCmd->AddParameter(new MCommandParameterUID(MUID(0,0))); pCmd->AddParameter(new MCommandParameterBool((bool)MGetServerConfig()->IsEnabledSurvivalMode())); pCmd->AddParameter(new MCommandParameterBool((bool)MGetServerConfig()->IsEnabledDuelTournament())); // pCmd->AddParameter(new MCommandParameterString("A")); // unsigned char tmp1 = 'A'; // void* pBlob1 = MMakeBlobArray(sizeof(unsigned char), sizeof(unsigned char)); // unsigned char* pCmdBlock1 = (unsigned char*)MGetBlobArrayElement(pBlob1, 0); // CopyMemory(pCmdBlock1, &tmp1, sizeof(unsigned char)); // pCmd->AddParameter(new MCommandParameterBlob(pBlob1, MGetBlobArraySize(pBlob1))); // MEraseBlobArray(pBlob1); unsigned char tmp = 0; void* pBlob = MMakeBlobArray(sizeof(unsigned char), sizeof(unsigned char)); unsigned char* pCmdBlock = (unsigned char*)MGetBlobArrayElement(pBlob, 0); CopyMemory(pCmdBlock, &tmp, sizeof(unsigned char)); pCmd->AddParameter(new MCommandParameterBlob(pBlob, MGetBlobArraySize(pBlob))); MEraseBlobArray(pBlob); return pCmd; }
void MMatchServer::OnAdminRequestKickPlayer(const MUID& uidAdmin, const char* szPlayer) { MMatchObject* pObj = GetObject(uidAdmin); if (pObj == NULL) return; if (!IsAdminGrade(pObj)) return; if ((strlen(szPlayer)) < 2) return; int nRet = MOK; MMatchObject* pTargetObj = GetPlayerByName(szPlayer); if (pTargetObj != NULL) { #ifdef LOCALE_KOREA pTargetObj->DisconnectHacker( MMHT_COMMAND_BLOCK_BY_ADMIN ); #else // Notify Message 필요 -> 관리자 전용 - 해결(특별한 메세지 필요 없음) Disconnect(pTargetObj->GetUID()); #endif } else { nRet = MERR_ADMIN_NO_TARGET; } MCommand* pNew = CreateCommand(MC_ADMIN_RESPONSE_KICK_PLAYER, MUID(0,0)); pNew->AddParameter(new MCmdParamInt(nRet)); RouteToListener(pObj, pNew); }
void MMatchServer::OnAsyncGetAccountItemList( MAsyncJob* pJobResult ) { MAsyncDBJob_GetAccountItemList* pJob = (MAsyncDBJob_GetAccountItemList*)pJobResult; if( MASYNC_RESULT_SUCCEED != pJob->GetResult() ) { mlog("GetAccountItemList Failed\n"); return; } MMatchObject* pObj = GetObject( pJob->GetPlayerUID() ); if( NULL == pObj ) return; if( !pJob->GetExpiredAccountItems().empty() ) { ResponseExpiredItemIDList(pObj, pJob->GetExpiredAccountItems()); } const int nAccountItemCount = pJob->GetAccountItemCount(); if (nAccountItemCount > 0) { MAccountItemNode* accountItems = pJob->GetAccountItemList(); if( NULL == accountItems ) return; MCommand* pNew = CreateCommand(MC_MATCH_RESPONSE_ACCOUNT_ITEMLIST, pObj->GetUID()); // 갖고 있는 아이템 리스트 전송 int nCountableAccountItemCount = 0; for(int i = 0; i < nAccountItemCount; i++ ) { if( accountItems[i].nCount > 0 && accountItems[i].nItemID > 0 ) { nCountableAccountItemCount++; } } void* pItemArray = MMakeBlobArray(sizeof(MTD_AccountItemNode), nCountableAccountItemCount); int nIndex = 0; for (int i = 0; i < nAccountItemCount; i++) { if( accountItems[i].nItemID == 0 ) continue; MTD_AccountItemNode* pItemNode = (MTD_AccountItemNode*)MGetBlobArrayElement(pItemArray, nIndex); _ASSERTE( ((NULL != MGetMatchItemDescMgr()->GetItemDesc(accountItems[i].nItemID)) || (NULL != m_GambleMachine.GetGambleItemByGambleItemID(accountItems[i].nItemID))) && "zitem.xml or GambleItem에 기술되어 있지 않는 아이템입니다." ); if( accountItems[i].nCount > 0 ) { Make_MTDAccountItemNode(pItemNode, accountItems[i].nAIID, accountItems[i].nItemID , accountItems[i].nRentMinutePeriodRemainder, accountItems[i].nCount); nIndex++; if( nIndex == nCountableAccountItemCount ) { break; } } } pNew->AddParameter(new MCommandParameterBlob(pItemArray, MGetBlobArraySize(pItemArray))); MEraseBlobArray(pItemArray); PostSafeQueue( pNew ); } }
void MMatchClient::OnResponseAgentLogin() { MCommand* pCmd = CreateCommand(MC_AGENT_PEER_BINDTCP, GetAgentServerUID()); pCmd->AddParameter(new MCmdParamUID(GetPlayerUID())); Post(pCmd); mlog("Logged in Agent, Bind TCP \n"); }
UINT DownloadFile(LPCWSTR asSource, LPCWSTR asTarget, DWORD& crc, DWORD& size, BOOL abShowAllErrors = FALSE) { UINT iRc = E_UNEXPECTED; UINT nWait; wchar_t* pszCommand = NULL; wchar_t* szCmdDirectory = NULL; // Destination directory for file creation MCHKHEAP; // Split target into directory and file-name LPCWSTR pszName = PointToName(asTarget); if (pszName > asTarget) { szCmdDirectory = lstrdup(asTarget); if (!szCmdDirectory) { iRc = E_OUTOFMEMORY; goto wrap; } szCmdDirectory[pszName-asTarget] = 0; } // Prepare command line for downloader tool pszCommand = CreateCommand(asSource, pszName, iRc); if (!pszCommand) { _ASSERTE(iRc!=0); goto wrap; } _ASSERTE(m_PI.hProcess==NULL); MCHKHEAP; nWait = ExecuteDownloader(pszCommand, szCmdDirectory); // Now check the result of downloader proc if (nWait != 0) { iRc = nWait; goto wrap; } if (!CalcFileHash(asTarget, size, crc)) { iRc = GetLastError(); if (!iRc) iRc = E_UNEXPECTED; goto wrap; } iRc = 0; // OK wrap: MCHKHEAP; SafeFree(pszCommand); SafeFree(szCmdDirectory); CloseHandles(); return iRc; };
void CScenePlay::updateScene() { // コマンド生成 CCommand command = CreateCommand(); // 正常に動作してるか判定を受け取る bool success = (this->*Sequence[SequenceState])(command); // 異常動作発生で強制終了 if(success) PostQuitMessage(WM_QUIT); // フレームレートの取得 updateFPS = updateFPSCount.getFrameRate_(); }
/** * 通告好友本人下线. * @param sock udp socket * @param pal class PalInfo */ void Command::SendExit(int sock, PalInfo *pal) { struct sockaddr_in addr; CreateCommand(IPMSG_DIALUPOPT | IPMSG_BR_EXIT, NULL); ConvertEncode(pal->encode); bzero(&addr, sizeof(addr)); addr.sin_family = AF_INET; addr.sin_port = htons(IPTUX_DEFAULT_PORT); addr.sin_addr.s_addr = pal->ipv4; sendto(sock, buf, size, 0, (struct sockaddr *)&addr, sizeof(addr)); }
/** * 发送本人的签名信息. * @param sock udp socket * @param pal class PalInfo */ void Command::SendMySign(int sock, PalInfo *pal) { struct sockaddr_in addr; CreateCommand(IPTUX_SENDSIGN, progdt.sign); ConvertEncode(pal->encode); bzero(&addr, sizeof(addr)); addr.sin_family = AF_INET; addr.sin_port = htons(IPTUX_DEFAULT_PORT); addr.sin_addr.s_addr = pal->ipv4; sendto(sock, buf, size, 0, (struct sockaddr *)&addr, sizeof(addr)); }
/** * 向好友请求共享文件信息. * @param sock udp socket * @param pal class PalInfo * @param opttype 命令额外选项 * @param attach 附加数据,即密码 */ void Command::SendAskShared(int sock, PalInfo *pal, uint32_t opttype, const char *attach) { struct sockaddr_in addr; CreateCommand(opttype | IPTUX_ASKSHARED, attach); ConvertEncode(pal->encode); bzero(&addr, sizeof(addr)); addr.sin_family = AF_INET; addr.sin_port = htons(IPTUX_DEFAULT_PORT); addr.sin_addr.s_addr = pal->ipv4; sendto(sock, buf, size, 0, (struct sockaddr *)&addr, sizeof(addr)); }
void MMatchServer::OnReport(const MUID& uidSender, const char* pName, const char* pReason) { MMatchObject* pObj = GetObject(uidSender); if (pObj && IsAdminGrade(pObj)) { char message[512]; if (strstr(pName, "%") || strstr(pReason, "%")) return; sprintf(message, "[REPORT]<%s> - %s : %s", pObj->GetCharInfo()->m_szName, pName, pReason); MCommand* pCmd = CreateCommand(MC_MATCH_ANNOUNCE, MUID(0,0)); pCmd->AddParameter(new MCommandParameterUInt(0)); pCmd->AddParameter(new MCommandParameterString(message)); } }
/** * 群发消息(被其他函数调用). * @param sock udp socket * @param pal class PalInfo * @param msg 消息数据 */ void Command::SendGroupMsg(int sock, PalInfo *pal, const char *msg) { struct sockaddr_in addr; CreateCommand(IPMSG_BROADCASTOPT | IPMSG_SENDMSG, msg); ConvertEncode(pal->encode); bzero(&addr, sizeof(addr)); addr.sin_family = AF_INET; addr.sin_port = htons(IPTUX_DEFAULT_PORT); addr.sin_addr.s_addr = pal->ipv4; sendto(sock, buf, size, 0, (struct sockaddr *)&addr, sizeof(addr)); }
MainWindow::MainWindow() : pimpl(new MainWindowImpl(6)) { set_border_width(10); Gtk::VBox *vb = new Gtk::VBox(false, 10); Gtk::HBox *hb = new Gtk::HBox(true, 10); hb->pack_start(*CreateCommand("Ring Up Peal", &Controller::RingUp)); hb->pack_start(*CreateCommand("Ring", &Controller::Ring)); hb->pack_start(*CreateCommand("Cheat", &Controller::GoToTop)); hb->pack_start(*CreateCommand("Change", &Controller::DoChange)); hb->pack_start(*CreateCommand("Plain Hunt", &Controller::GoPlainHuntDoubles)); hb->pack_start(*pimpl->m_CurrentFps, false, false, 10); vb->pack_start(*hb, true, true, 10); vb->pack_start(pimpl->mOgreWidget, true, true, 10); add(*vb); show_all(); Glib::signal_idle().connect(sigc::mem_fun(this, &MainWindow::UpdateBells)); }
/** * 通告好友本人个人信息已变. * @param sock udp socket * @param pal class PalInfo */ void Command::SendAbsence(int sock, PalInfo *pal) { struct sockaddr_in addr; CreateCommand(IPMSG_ABSENCEOPT | IPMSG_BR_ABSENCE, progdt.nickname); ConvertEncode(pal->encode); CreateIptuxExtra(pal->encode); bzero(&addr, sizeof(addr)); addr.sin_family = AF_INET; addr.sin_port = htons(IPTUX_DEFAULT_PORT); addr.sin_addr.s_addr = pal->ipv4; sendto(sock, buf, size, 0, (struct sockaddr *)&addr, sizeof(addr)); }
/** * 向好友发送文件信息. * @param sock udp socket * @param pal class PalInfo * @param opttype 命令额外选项 * @param extra 扩展数据,即文件信息 */ void Command::SendFileInfo(int sock, PalInfo *pal, uint32_t opttype, const char *extra) { struct sockaddr_in addr; CreateCommand(opttype | IPMSG_FILEATTACHOPT | IPMSG_SENDMSG, NULL); ConvertEncode(pal->encode); CreateIpmsgExtra(extra, pal->encode); bzero(&addr, sizeof(addr)); addr.sin_family = AF_INET; addr.sin_port = htons(IPTUX_DEFAULT_PORT); addr.sin_addr.s_addr = pal->ipv4; sendto(sock, buf, size, 0, (struct sockaddr *)&addr, sizeof(addr)); }
void MMatchServer::OnStop(const MUID& uidSender, const char* pName) { MMatchObject* pObj = GetObject(uidSender); if (pObj && IsAdminGrade(pObj)) { MMatchObject* pTarget = GetPlayerByName(pName); if (pTarget) { MCommand* pCmd = CreateCommand(MC_ADMIN_STOP, MUID(0,0)); pCmd->AddParameter(new MCmdParamStr(pName)); RouteToListener(pTarget, pCmd); } LogCommand("stop", pObj->GetCharInfo()->m_szName, ""); } }
void MMatchServer::OnAdminPingToAll(const MUID& uidAdmin) { MMatchObject* pObj = GetObject(uidAdmin); if (pObj == NULL) return; // 관리자 권한을 가진 사람이 아니면 연결을 끊는다. if (!IsAdminGrade(pObj)) { // DisconnectObject(uidAdmin); return; } MCommand* pNew = CreateCommand(MC_NET_PING, MUID(0,0)); pNew->AddParameter(new MCmdParamUInt(GetGlobalClockCount())); RouteToAllConnection(pNew); }
/** * 尝试着给某计算机发送一个上线信息数据包. * @param sock udp socket * @param ipv4 ipv4 address */ void Command::SendDetectPacket(int sock, in_addr_t ipv4) { struct sockaddr_in addr; CreateCommand(IPMSG_DIALUPOPT | IPMSG_ABSENCEOPT | IPMSG_BR_ENTRY, progdt.nickname); ConvertEncode(progdt.encode); CreateIptuxExtra(progdt.encode); bzero(&addr, sizeof(addr)); addr.sin_family = AF_INET; addr.sin_port = htons(IPTUX_DEFAULT_PORT); addr.sin_addr.s_addr = ipv4; sendto(sock, buf, size, 0, (struct sockaddr *)&addr, sizeof(addr)); }
/** * 回复已收到消息. * @param sock udp socket * @param pal class PalInfo * @param packetno 好友消息的包编号 */ void Command::SendReply(int sock, PalInfo *pal, uint32_t packetno) { char packetstr[11]; //10 +1 =11 struct sockaddr_in addr; snprintf(packetstr, 11, "%" PRIu32, packetno); CreateCommand(IPMSG_SENDCHECKOPT | IPMSG_RECVMSG, packetstr); ConvertEncode(pal->encode); bzero(&addr, sizeof(addr)); addr.sin_family = AF_INET; addr.sin_port = htons(IPTUX_DEFAULT_PORT); addr.sin_addr.s_addr = pal->ipv4; sendto(sock, buf, size, 0, (struct sockaddr *)&addr, sizeof(addr)); }