掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
スタックオーバーフローにならいようにするためには? (ID:67348)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
TCP送受信のプログラムを作成しているところですが、 スタックオーバーフローが出てしまいます。 MS visualStuio2003の出力は以下のとおりです。OSはXP pro SP1です。 TEST.exe!_chkstk() 行 91 Asm TEST.exe!_NMSG_WRITE(int rterrnum=0x00000019) 行 194 + 0x18 TEST.exe!_amsg_exit(int rterrnum=0x00000019) 行 320 + 0x9 TEST.exe!_purecall() 行 53 + 0x7 C TEST.exe!std::_Destroy<RecvDataBuff>(RecvDataBuff * _Ptr=0x00abcb10) 行 49 + 0xf C++ TEST.exe!std::allocator<RecvDataBuff>::destroy(RecvDataBuff * _Ptr=0x00abcb10) 行 152 + 0x9 C++ TEST.exe!std::deque<RecvDataBuff,std::allocator<RecvDataBuff> >::pop_front() 行 575 C++ TEST.exe!std::queue<RecvDataBuff,std::deque<RecvDataBuff,std::allocator<RecvDataBuff> > >::pop() 行 72 C++ TEST.exe!CSockTcp::GetRecvData() 行 260 C++ CByteArray& CSockTcp::GetRecvData() { m_recv.Copy( m_queue.front() ); m_queue.pop(); return m_recv; } TEST.exe!CXXXDlg::RecvData(PEER_KIND peer=PEER_CTL2, long size=0x0000000c) 行 656 + 0x12 C++ // 受信データ取得 ☆m_recvBuf.Copy( m_sockObj[peer]->GetRecvData() );☆ 原因は以下のエラーだとおもうのですが、なんでこれが出るのかがわからないのです。 rterrno=0x00000019 rterrtxt=0x00624c90 R6025 pure virtual function call virtual function なんて呼び出してないよ>< スタックオーバーフローは関数を呼び出しすぎると起きるそうですが、 送受信のためにぐるぐる回していても問題ないですよね? 情報が足りないかもしれませんが、コードの抜粋を載せます。 (エラーのところも少し載せてますが) class RecvDataBuff : public CByteArray { public: RecvDataBuff(); RecvDataBuff(const RecvDataBuff& src); ~RecvDataBuff(); }; ソケットは、送受信用にサーバーが3個、クライアントを1個使用しています。 受信処理は以下のような感じでヘッダのサイズ情報からメッセージ分だけ受信するようにしています。 bool CSockServer::RecvData() { struct MIF_0001 hed = {0}; long rtn; LPBYTE ptr = (LPBYTE)&hed; long size = sizeof(struct MIF_0001); RecvDataBuff tmp; long total; // ヘッダ部受信 while( size > 0 ) { rtn = Recv( ptr, size ); if ( rtn < 0 && rtn != SS_TIMEOUT ) { CloseSocket(); return false; } if ( rtn == SS_TIMEOUT ) { return true; } ptr += rtn; size -= rtn; } // 総サイズ // total = ntohs(hed.msg_size) + sizeof(hed); total = ntohs(hed.msg_size); tmp.SetSize( total ); // ヘッダサイズを除くサイズ size = total - sizeof(struct MIF_0001); if ( size > 0 ) { ptr = tmp.GetData(); ptr += sizeof(struct MIF_0001); RecvData( ptr, size ); } memcpy( tmp.GetData(), &hed, sizeof(struct MIF_0001) ); m_queue.push( tmp ); ::PostMessage( m_hWnd, WM_SS_RECV, m_threadNum, total ); return true; } 補足:queue<RecvDataBuff> m_queue;
←解決時は質問者本人がここをチェックしてください。
更新する
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.