CAsyncSocket的Receive动作过程是怎样的?是否会自动产生一个线程来执行OnReceive消息?

dracoo 2004-07-27 12:48:42
在Socket通信中,发送数据后,要等待返回数据,数据的接收通过OnReceive处理,因此用Event来通知数据收到,如下情形:

mySocket *m_Socket;
//mySocket 是自定义的基于CAsyncSocket的类。包含OnReveice消息
...
m_Socket->Send(&SndMsg, sizeof(SndMsg));
ResetEvent( hReqEvent );
if( WaitForSingleObject( hReqEvent, 2000 ) != WAIT_OBJECT_0 ) return -1;

在OnReceive中,完成接收后用 SetEvent( hReqEvent );来发出通知。

现在的问题是WaitForSingleObject总是失败,程序一直到等待超时后方才转入OnReveice中处理。
是不是我的方法有问题?
...全文
203 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
dracoo 2004-07-28
  • 打赏
  • 举报
回复
换一种方式问,就是当一段程序在执行中时,OnReceive是否能并发运行。从我写的程序来看,这个问题并不确定。那么在什么情况下会造成OnReceive无法被激活?
Hotthing 2004-07-27
  • 打赏
  • 举报
回复
int CDataSocket::Receive()
{
int nRead = 0;

if (m_nStatus == XFERMODE_RECEIVE)
{
if (m_File.m_hFile == NULL)
return 0;

byte data[PACKET_SIZE];
nRead = CAsyncSocket::Receive(data, PACKET_SIZE);

switch(nRead)
{
case 0:
{
m_File.Close();
m_File.m_hFile = NULL;
Close();
// tell the client the transfer is complete.
m_pConnectSocket->SendResponse("226 Transfer complete");
// destroy this socket
AfxGetThread()->PostThreadMessage(WM_THREADMSG, 0, 0);
// upload succesfull
((CConnectThread *)AfxGetThread())->UpdateStatistic(FTPSTAT_UPLOADSUCCEEDED);
break;
}
case SOCKET_ERROR:
{
if (GetLastError() != WSAEWOULDBLOCK)
{
m_File.Close();
m_File.m_hFile = NULL;
Close();
m_pConnectSocket->SendResponse("426 Connection closed; transfer aborted.");
// destroy this socket
AfxGetThread()->PostThreadMessage(WM_THREADMSG, 0, 0);
// upload failed
((CConnectThread *)AfxGetThread())->UpdateStatistic(FTPSTAT_UPLOADFAILED);

}
break;
}
default:
{
((CConnectThread *)AfxGetThread())->IncReceivedBytes(nRead);

TRY
{
m_File.Write(data, nRead);
}
CATCH_ALL(e)
{
m_File.Close();
m_File.m_hFile = NULL;
Close();
m_pConnectSocket->SendResponse("450 can't access file.");
// destroy this socket
AfxGetThread()->PostThreadMessage(WM_THREADMSG, 0, 0);
// upload failed
((CConnectThread *)AfxGetThread())->UpdateStatistic(FTPSTAT_UPLOADFAILED);
return 0;
}
END_CATCH_ALL;
break;
}
}
}
return nRead;
}
mfmmfc 2004-07-27
  • 打赏
  • 举报
回复
不是一个线程,而是收到一个FD_READ的消息
dracoo 2004-07-27
  • 打赏
  • 举报
回复
我所希望的是在OnReceive收到数据后通知 WaitForSingleObject处,让程序继续往下走。
我感觉,Socket在获得Receive消息,去运行OnReceive函数时,类似一个子线程,所以我用Event来进行线程间通信。
奇怪的是:如果Socket通信初次发生,WaitForSingleObject总是失败,但要是发生过一次Receive,则WaitForSingleObject就能成功收到Event事件。为什么?
everandforever 2004-07-27
  • 打赏
  • 举报
回复
CAsyncSocket 本身会自动为你调用 OnReceive 的, 你需要做的是在OnReceive被调用时调用Receive就可以了.

18,363

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧