ftp客户端的Control socket突然不能接收到OnReceiv(..)事件通知?????

kaxiou 2003-10-19 01:17:48
刚开始的时候Control socket可以接收到,到了后来却突然不能接收到。
我用sniffer抓包却发现服务器是返回了消息的,只是我的客户端收不到OnReceiv(..)事件通知而已。在接收不到事件通知后,socket还是有效,可以发命令给服务器
并且成功。
后来我试着在发送命令之间Sleep(100),发现接收不到事件通知的机率大大减少。
实在是搞不懂。各位大侠帮帮啊。谢谢先
...全文
61 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
CounterHack 2003-10-22
  • 打赏
  • 举报
回复
windows是由事件驱动的,不同与UNIX下的线程。

虽然windows的不同线程不会相互影响,但由于所有的消息最初是发到windows内核的总消息队列中的,所以一个线程的消息太多导致线程阻塞从而导致更多的消息(虽然是本线程的,但内核并不分),最终内核将对部分消息进行丢弃,从而间接影响了另一线程。

就像windows下的某个程序假死了,导致Explorer都反应迟钝。
hoffen 2003-10-22
  • 打赏
  • 举报
回复
一定是界面MESSAGE的问题了,请检查一下PreTranslateMessage()函数
Good Luck
xiaohyy 2003-10-22
  • 打赏
  • 举报
回复
>>如果是界面线程给堵塞住了,但是从网络来的消息应该还在线程的消息队列中吧?即使是
界面线程给堵塞住了,但是当不再堵塞的时候,socket应该还是可以接收到那个网络事件通知吧?

所谓消息循环堵塞,是指大量的消息涌入,导致一些消息丢失。比如很短的一段时间内接受到大量消息(比如mousemove消息),其中一部分消息就会从消息队列中抛弃
kaxiou 2003-10-22
  • 打赏
  • 举报
回复
谢谢两位的提议。我根据两位的意见修改的程序,基本上没有什么问题了。
不过我还有一个不懂的地方想请教两位
fantiyu(fantiyu)说是消息循环堵塞了。
如果是界面线程给堵塞住了,但是从网络来的消息应该还在线程的消息队列中吧?即使是
界面线程给堵塞住了,但是当不再堵塞的时候,socket应该还是可以接收到那个网络事件通知吧?但是socket怎么会接收不到事件通知呢?
还请两位指点一下。谢谢
CounterHack 2003-10-20
  • 打赏
  • 举报
回复
OnReceive()的接收缓冲区设定太小了,导致每次接收数据都有剩余部分在缓冲区中。

修改OnReceive()函数:
int const INT_MAX_LEN = 100;
char buf[INT_MAX_LEN];
while((int nCount = Recv(buf, INT_MAX_LEN)) > 0)
{
//处理缓冲区数据。
... ...
}

如果对内存要求不高,可以设定INT_MAX_LEN > 2000,一般也可消除问题。
fantiyu 2003-10-19
  • 打赏
  • 举报
回复
消息循环堵塞了

检查你的消息循环,界面线程做了什么阻塞型的动作?

18,356

社区成员

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

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