日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

关于ACE_Svc_Handler

發布時間:2025/3/21 c/c++ 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 关于ACE_Svc_Handler 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
我聲明一個繼承至 ACE _Svc_Handler的類:mainTask.其中有成員變量:std:vector<T> list;我在回調handle_input中向list中放入內容,在handle_output中從list中取,但是在handle_input中是放入成功了,但是在handle_output中取的時候,發現list中是有內容,但是內容不正確。不是在huandle_input時候放入的內容。

為什么list中的內容在handle_output中取不出來呢?


類的聲明:
class MainTask :public ACE_Svc_Handler<ACE_SOCK_STREAM, ACE_MT_SYNCH>
{
? ? ? ? typedef ACE_Svc_Handler<ACE_SOCK_STREAM, ACE_MT_SYNCH> super;

public:
? ? ? ? MainTask () : notifier_ (0, this, ACE_Event_Handler::WRITE_MASK)
? ? ? ? {}

? ? ? ? virtual int open (void * = 0);

? ? ? ? virtual int handle_input (ACE_HANDLE fd = ACE_INVALID_HANDLE);

? ? ? ? virtual int handle_output (ACE_HANDLE fd = ACE_INVALID_HANDLE);

public:
? ?? ??// 在handle_input函數中向此列表中插入數據,在handle_output函數中取出。
? ? ? ? std::vector<sFesRawDataReq*>? ? ? ? ? ? ? ? m_reqlist;

private:

? ? ? ? ACE_Reactor_Notification_Strategy? ? ? ? notifier_;
? ? ? ??
? ? ? ? ACE_Mutex? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? m_mutex;
};

//?handle_input在此函數中向m_reqlist中插入內容。此處跟蹤沒有出問題。
int MainTask::handle_input (ACE_HANDLE)
{
? ? ? ??
? ? ? ? char buf[21];
? ? ? ? // 接收主程序數據請求,并放入請求隊列:m_reqlist
? ? ? ? ssize_t recv_cnt = this->peer ().recv (buf, sizeof (buf) - 1);
? ? ? ? if (recv_cnt > 0)
? ? ? ? {
? ? ? ? ? ? ? ? buf[recv_cnt] = '\0';
? ? ? ? ? ? ? ? sFesRawDataReq *pdata = new sFesRawDataReq;
? ? ? ? ? ? ? ? pdata = (sFesRawDataReq*)buf;
? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? // 操作之前先鎖定
? ? ? ? ? ? ? ? m_mutex.acquire();
? ? ? ? ? ? ? ? // 檢查請求列表,始終只維持一個IP的一個請求。如果有重復IP,則刪除前一個請求。
? ? ? ? ? ? ? ? std::vector<sFesRawDataReq*>::iterator iter =m_reqlist.begin();
? ? ? ? ? ? ? ? int flag = 0;
? ? ? ? ? ? ? ? for (iter;iter != m_reqlist.end();iter++)
? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? ? ? sFesRawDataReq *ptemp = (*iter);
? ? ? ? ? ? ? ? ? ? ? ? if (ACE_OS::strncmp(ptemp->ip,pdata->ip,ACE_OS::strlen(pdata->ip)) == 0)
? ? ? ? ? ? ? ? ? ? ? ? {? ? ? ??
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? m_reqlist.erase(iter);
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? iter = m_reqlist.begin();
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? m_reqlist.push_back(pdata);
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? flag = 1;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? break;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? // 此請求為新請求,放入隊列。
? ? ? ? ? ? ? ? if (flag == 0)
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? m_reqlist.push_back(pdata);
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? // 釋放鎖
? ? ? ? ? ? ? ? m_mutex.release();
? ? ? ? ? ? ? ? return 0;
? ? ? ? }
? ? ? ??
? ? ? ? return 0;
}
// 取m_reqlist中的內容。但是取出的是亂碼。
int MainTask::handle_output (ACE_HANDLE)
{
? ? ? ??
? ? ? ? ACE_Message_Block *mb;

? ? ? ? ACE_Time_Value nowait (ACE_OS::gettimeofday ());
? ? ? ? while (-1 != this->getq (mb, &nowait))
? ? ? ? {
? ? ? ? ? ? ? ? // 消息內容長度
? ? ? ? ? ? ? ? size_t len = mb->length();

? ? ? ? ? ? ? ? // 消息塊內容
? ? ? ? ? ? ? ? char *buff = mb->rd_ptr();
? ? ? ? ? ? ? ? sFesRawDataInfo *pdata = (sFesRawDataInfo*)buff;

? ? ? ? ? ? ? ? std::vector<sFesRawDataReq*>::iterator iter = m_reqlist.begin();
? ? ? ? ? ? ? ? // 讀取請求之前先鎖定
? ? ? ? ? ? ? ? m_mutex.acquire();

? ? ? ? ? ? ? ? //判斷此次讀取的記錄是否為主程序請求數據,如果是,則發送給主程序。
? ? ? ? ? ? ? ? for (iter;iter != m_reqlist.end();iter++)
? ? ? ? ? ? ? ? {
//?此處顯示取出的是亂碼
? ? ? ? ? ? ? ? ? ? ? ? sFesRawDataReq* preq = (sFesRawDataReq*)*iter;
? ? ? ? ? ? ? ? ? ? ? ? if (preq->id == pdata->id)
? ? ? ? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? size_t send_cnt = this->peer ().send (mb->rd_ptr(), len);

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? if (send_cnt == -1)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ACE_ERROR ((LM_ERROR,ACE_TEXT ("(%P|%t) %p\n"),ACE_TEXT ("send")));
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? else
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? // 更新消息塊讀指針
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? mb->rd_ptr (ACE_static_cast (size_t, send_cnt));

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? mb->release ();
? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? // 釋放鎖
? ? ? ? ? ? ? ? m_mutex.release();
? ? ? ? }
? ? ? ??
? ? ? ? return 0;
}



問題解決了。原因是沒有把數據從接收緩沖區拷貝出來。

總結

以上是生活随笔為你收集整理的关于ACE_Svc_Handler的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。