我用CSocket, CArchive, CSocketFile编写的程序, 我在服务器端做了两个继承类,CSocketSrv和CSocketRev继承自CSocket我重写拉CSocketSrv内的OnAccept()函数, 重写拉CSocketRev的OnReceive()函数,结果总是在OnReceive函数内出现以下问题:
void CRecvSocket::OnReceive(int nErrorCode)
{
// TODO : ここに特定なコードを追加するか、もしくは基本クラスを呼び出してください。
CString str; m_ArIn->Flush();
CancelBlockingCall( );
(*m_ArIn) >> str;
//Sleep(1000);
TRACE(">>>>>>> On Receive Message! <<<<<<\n");
m_Dlg->server_Recv.SetWindowText(str);
m_Dlg->server_Recv.Invalidate();
CSocket::OnReceive(nErrorCode);
}
这个函数内有TRACE(">>>>>>> On Receive Message! <<<<<<\n");或者AfxMessageBox();函数时就没问题
,否则, 就可能在接受到几条信息后,就没反应拉。
其他函数为:
BOOL CserverDlg::OnInitDialog()
{
CDialog::OnInitDialog(); // "バージョン情報..." メニューをシステム メニューに追加します。 // IDM_ABOUTBOX は、システム コマンドの範囲内になければなりません。
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
} // このダイアログのアイコンを設定します。アプリケーションのメイン ウィンドウがダイアログでない場合、
//  Framework は、この設定を自動的に行います。
SetIcon(m_hIcon, TRUE); // 大きいアイコンの設定
SetIcon(m_hIcon, FALSE); // 小さいアイコンの設定 if (!AfxSocketInit())
{
AfxMessageBox("Initial Error!");
return FALSE;
}
// TODO: 初期化をここに追加します。
if(ServSock = new CServSocket(this))
{
if(ServSock->Create(9547))
{
server_Recv.SetWindowText("お待ち下さい、Clientと接続しています");
ServSock->Listen();
} else
{
server_Recv.SetWindowText("Initial failed, please restart the program");
delete ServSock;
}
}
else
server_Recv.SetWindowText("Initial failed, please restart the program");
return TRUE;  // フォーカスをコントロールに設定した場合を除き、TRUE を返します。
}
// CServSocket メンバ関数
void CServSocket::OnAccept(int nErrorCode)
{
// TODO : ここに特定なコードを追加するか、もしくは基本クラスを呼び出してください。
CRecvSocket *tempSock;
//AfxBeginThread(SubThread,(LPVOID)tempSock); if(tempSock = new CRecvSocket(this->m_Dlg))
{
if(Accept(*tempSock))  //accept ask 
{
tempSock->m_File = new CSocketFile(tempSock);
tempSock->m_ArIn = new CArchive(tempSock->m_File, CArchive::load);
tempSock->m_ArOut = new CArchive(tempSock->m_File, CArchive::store);
m_Dlg->RecvSock = tempSock;
tempSock = NULL;
m_Dlg->server_Recv.SetWindowText("接続成功! ");
}
else
{
m_Dlg->server_Recv.SetWindowText("接続失敗!");
delete tempSock;
}
}
else
m_Dlg->server_Recv.SetWindowText("接続失敗!");
CSocket::OnAccept(nErrorCode);
}