我模仿MSDN CHARROOM那种用CArchive发送消息的方式写了一个C/S模式的程序,现在发现发几次信息出去就发不出去了。这是为什么?高手解答

解决方案 »

  1.   

    调用每个function,chech它的return value。
      

  2.   

    我大概描述一下,我是在CSOCKET派生的类clientsocket里申明了CsocketFile,两个CArchive out&in加到CSOKETFILE里,还有一个用于显示接收的消息的对话框执政Msgdlg,以及发送消息用的Messg类继承于COBJECT,主要是利用serilize将Messg内的CString变量text写入CArichive out,然后写完把数据Flush()掉。由于client这边有几个界面,所以同时我每个界面里也申明了一个client指针,都是指向同一个clientsocket,点击相应的界面的控件发送不同的消息给SERVER。现在的问题是,刚连接上的第一个消息肯定发的出去,但是随后几个就很难说了,这个是为什么了,我查过OnReceive,这种情况下OnReceive完全没反应。SERVER这端另有一SOCKET用于接收消息,不同于ClientSocket.有人能告诉我是为什么么?
      

  3.   

    再补充一句,我在发送端的发送部分和接收端的接收部分加了监视的代码后,发现我说的发不出去消息的情况是发送端已经把消息写入CArchive out了,但是客户端的OnReceive却没有反应
      

  4.   

    检查你的CArichive Out对象创建是否正确,然后看看 OnReceive的时候 是否已经调用了CArichive IN进行了缓冲区数据的接受
      

  5.   

    用lasterror看看什么错误就知道了
      

  6.   

    大家说的这几个都没有问题,我说的是OnReceive没反应是连信息都没接收到,根本没调用OnReceive,开始都没问题,发着发着就有问题了。
      

  7.   

    我这个不是多线程的,第一次用MFC写这个,单线程也会出现线程阻塞?
    没有自己定义线程,难道我对线程理解有问题?
      

  8.   

    我看了某位大哥的帖子在OnReceive里加了AsyncSelect(FD_READ),几乎就没有这种情况了,为什么,哪个大哥给我解释下啊···
      

  9.   

    这是因为之前是阻塞模式,如果有一个包发送失败,程序就在那儿等着,如果这个包一直发送不出去,那么程序就一直等。
    用AsyncSelect(FD_READ)是设定了超时,比如你设定的时间是10秒,如果10秒钟这个包发不出去,程序就会放弃,不会一直等在那。另外,强烈建议楼主别用CSocket,有时候出错莫名其妙,调试起来累死人,建议从底层写起,用winsock,很灵活,也不太难,强烈建议!!