none
用Send函数连续发送时候消息时候sleep的控制 RRS feed

  • 问题

  • 用MFC的CAsyncSocket来实现一个简单的连续发送功能,我创建了一个线程,在线程里,用了一个while循环去Send,在我的机子上每次循环Send前Sleep(1)一下,在另外一方OnReceive就能接收到正确数据,但是程序放在另外一台机子上Sleep(1)就出错了,改为Sleep(500)又正常了。这个问题怎么解决???
    2011年7月27日 1:37

答案

  • Send不需要Sleep啊,你这样的用法不对

    应该是Send后等待异步完成的CallBack,然后再Send,在异步中用Sleep等待是危险的和不可预计结果的,可能导致后面数据覆盖前面的


    0xBAADF00D
    • 已标记为答案 Rob Pan 2011年8月2日 9:05
    2011年7月27日 11:35
    版主
  • 检查Send的返回值,如果循环send的话,有可能sendbuf会满导致发送失败。
    • 已标记为答案 Rob Pan 2011年8月2日 9:05
    2011年7月28日 3:20

全部回复

  • 你的网络封包有没有做正确的标识,例如长度,起止符号之类的?

     

    TCP 是一个基于流的协议,很容易就出现封包粘连,封包截断的情况。


    学习学习....
    2011年7月27日 2:51
  • 有的,我用了一个包的长度
    2011年7月27日 3:57
  • Sleep(1)就出错了,改为Sleep(500)又正常了。
    -------------------------------------------

    您说的出错是什么意思?发送方发送过快,接收端接收处理太慢,导致发送端的Send()调用失败?返回SOCKET_ERROR ?


    Visual C++ enthusiast, like network programming and driver development. At present is being engaged in the WinCE/Windows Mobile platform embedded development.
    2011年7月27日 4:59
    版主
  • Send不需要Sleep啊,你这样的用法不对

    应该是Send后等待异步完成的CallBack,然后再Send,在异步中用Sleep等待是危险的和不可预计结果的,可能导致后面数据覆盖前面的


    0xBAADF00D
    • 已标记为答案 Rob Pan 2011年8月2日 9:05
    2011年7月27日 11:35
    版主
  • 检查Send的返回值,如果循环send的话,有可能sendbuf会满导致发送失败。
    • 已标记为答案 Rob Pan 2011年8月2日 9:05
    2011年7月28日 3:20