OnReceive为什么不被调用?

g_yxh 2005-10-08 09:44:37
CAsyncSocket的OnReceive函数执行是不是一定要个窗口对象来触发?如果是Win32 Console Application的工程,该怎么让它触发呢?
...全文
370 点赞 收藏 18
写回复
18 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
cqgaoke 2006-01-10
客户端接字的创建是时不能要端口号,否则不能触发ONRECEIVE
回复
cqgaoke 2006-01-06
ONRECEIVE何时才能收到。
回复
xianshiqi 2006-01-06
控制台应用程序中receive()是要有函数调用的,至于如何调用,那就要根据你编程时程序执行顺序来实现,所以要保证服务器端和客户端receive()和send()的一致性
回复
danielzhu 2006-01-06
UP
回复
g_yxh 2005-10-10
up,高手们帮帮忙啊
回复
ggw 2005-10-10
文档上说只调用返回出错且错误为WSAEWOULDBLOCK时且应用程序使用才能收到可覆盖的回调时才能收OnConnect消息。查MSDN
回复
ufox 2005-10-10
没有窗口
消息不知道推动到那
------------------------

正确,你可以建立一个窗口但是不显示啊,把这些消息和该窗口联系起来。使用CAsyncSocket是需要这么一个步骤的。
CSocket已经预先建立了窗口了
我现在已经不在使用微软封装的几个xSocket类了,他们对于跨线程和在动态库中使用,经验丰富的人一定会大伤脑筋的哦,建议直接使用socket API吧,用来也并不复杂
回复
nuaawenlin 2005-10-09
没有窗口
消息不知道推动到那

用多线程可以正常接收和发送
回复
g_yxh 2005-10-09
是啊,连接成功了的,但把断点放在这个函数里:
void CClientSocket::OnConnect(int nErrorCode)
{
// TODO: Add your specialized code here and/or call the base class

CAsyncSocket::OnConnect(nErrorCode);
}
就会发现,没有执行这个函数。
其他的OnXxx函数同样没有执行到的。
回复
annalee 2005-10-09
OnConnect是你重载CAsyncSocket的OnConnect事件???
都能收发,说明连接成功了啊!

我有一个问题:我服务器端,可以收发几次后,就收不到客户端发来的信息了,但是客户端显示发送成功,这是怎么回事??请指教
回复
g_yxh 2005-10-09
nuaawenlin(飘人) :就是想问问,在Win32 Console Application里面,该怎样才能让OnXxx函数收到消息?因为现在连接关闭后,程序不知道,我想用OnClose来处理
回复
g_yxh 2005-10-08
调用了这个的呀:
cSock->AsyncSelect(FD_READ | FD_WRITE | FD_CLOSE | FD_CONNECT | FD_OOB);
回复
DentistryDoctor 2005-10-08
CAsyncSocket在内部会自己创建一个窗口的。

FD_READ?
回复
g_yxh 2005-10-08
没有人回答吗?
回复
g_yxh 2005-10-08
可能我没说清楚,现在的问题是,通信都很正常,如果直接用cSock->Receive可以接收数据,cSock->Send也正常,但就是OnXxx函数不能被调用
回复
load888 2005-10-08
看看下面的你就知道啦

转载:
-------------------


FD_WRITE 相对来说就麻烦一些. 首先, 当你建立了一个连接时, 会产生一个 FD_WRITE 事件. 但是如果你认为在收到 FD_WRITE 时调用 send() 就万事大吉, 那就错了. FD_WRITE 事件只在发送缓冲区有多出的空位, 可以容纳需要发送的数据时才会触发.

上面所谓的发送缓冲区,是指系统底层提供的缓冲区. send() 先将数据写入到发送缓冲区中, 然后通过网络发送到接收端. 你或许会想, 只要不把发送缓冲区填满, 让发送缓冲区保持足够多的空位容纳需要发送的数据, 那么你就会源源不断地收到 FD_WRITE 事件了. 嘿嘿, 错了.上面只是说 FD_WRITE 事件在发送缓冲区有多出的空位时会触发, 但不是在有足够的空位时触发, 就是说你得先把发送缓冲区填满.

通常的办法是在一个无限循环中不断的发送数据, 直到把发送缓冲区填满. 当发送缓冲区被填满后, send() 将会返回 SOCKET_ERROR , WSAGetLastError() 会返回 WSAWOULDBLOCK . 如果当前这个 SOCKET 处于阻塞(同步)模式, 程序会一直等待直到发送缓冲区空出位置然后发送数据; 如果SOCKET是非阻塞(异步)的,那么你就会得到 WSAWOULDBLOCK 错误. 于是只要我们首先循环调用 send() 直到发送缓冲区被填满, 然后当缓冲区空出位置来的时候, 系统就会发出FD_WRITE事件. 有没有想过我能指出这一点来是多么不容易, 你可真走运. 下面是一个处理 FD_WRITE 事件的例子.

case FD_WRITE: // 可以发送数据了
{
// 进入无限循环
while(TRUE)
{
// 从文件中读取数据, 保存到 packet.data 里面.
in.read((char*)&packet.data, MAX_PACKET_SIZE);

// 发送数据
if (send(wparam, (char*)(&packet), sizeof(PACKET), 0) == SOCKET_ERROR)
{
if (WSAGetLastError() == WSAEWOULDBLOCK)
{
// 发送缓冲区已经满了, 退出循环.
break;
}
else // 其他错误
{
// 显示出错信息然后退出.
CleanUp();
return(0);
}
}
}
} break;
回复
g_yxh 2005-10-08
把代码贴出来,大家帮我看看啊:
有个CClientSocket类,继承CAsyncSocket,里面有OnReceive、OnConnect等函数,是用classWizard自动生成的。
然后在程序里用下面这段来调用:

AfxSocketInit();
BOOL bOK;
CClientSocket * cSock = new CClientSocket();
if(cSock != NULL)
{
bOK = cSock->Create();
if(bOK == TRUE)
{
cSock->AsyncSelect(FD_READ | FD_WRITE | FD_CLOSE | FD_CONNECT | FD_OOB);
cSock->Connect("towel.blinkenlights.nl", 23);
Sleep(90);
}
else
{
ASSERT(FALSE); //Did you remember to call AfxSocketInit()?
delete cSock;
cSock = NULL;
}
}

connect后,OnConnect没有被执行到。
回复
legendhui 2005-10-08
xx
回复
发帖
网络编程
创建于2007-09-28

1.8w+

社区成员

VC/MFC 网络编程
申请成为版主
帖子事件
创建了帖子
2005-10-08 09:44
社区公告
暂无公告