如题!!!,请教高手
解决方案 »
- 关于多线程绘制图片的问题
- 如何在已有的API代码上,观察函数参数的传递情况?
- 两个文件绑定在一起时候出的错
- dll如何取得指定窗口消息转换前的消息,该窗口不是MFC窗口能不能得到相当于CWND的PreTranslateMessage时的消息
- *****************新手问题来帮忙,dll使用问题*******************
- 请问有没有不装vc用nmake的方法
- 怎么没有SOCKS Protocol Version 4的rfc?
- (opengl)一个很简单的问题
- 打印字体如何控制
- 如何使属性页上的“帮助按钮”不显示,请高手帮帮忙,一定给分
- 请问如何获得其它程序有输入焦点的窗口句柄?如何拦截其他程序的按键消息,并在哪个消息发生作用前附加自己的处理过程?
- 在对话框中输入数据,怎么这个数据赋给一格int变量?
服务器端分10000个包,每个包都有编号,在GetQue线程中投递WSAsend发送,在GetQue中得到发送字节数等于发送数,继续投递下一个WSAsend发送,依次循环,全部发送完后,结果客户端收到的全部数据小于服务器发送的数据?不知流程是否有问题,请指点,谢谢!!
WSAsend是一种重叠操作, 一般调用是立即返回, 当返回0 表示发送成功, 否则如果返回WSA_IO_PENDING 表示这时候系统正在发送数据, 那么你需要通过GetQue来获得此次发送的结果,
到底是发送了几个字节(通过GetQue的参数dwSendNumBytes获知.)
客户端采用Csocket OnRecice后recv到信息直接写文件,不做其它事情。
服务器端:线程A检测有没有发往客户端的信息,有的话就产生信息写入发送缓冲区a,判断该客户端SOCKET是否正在发送,如没有发送就PostQueuedCompletionStatus(m_hiocp, 0, (DWORD)lpmyio, &lpmyio->pSIOContext->ol); 通知完成端口开始发送数据。
完成端口GetQue返回后就检测发送缓冲区a有没有等待发送的数据,有就取得数据投递WSASend发送,等下次GetQue返回时候判断发送字节是否等于需要发送数据,如确认相等后就继续从发送缓冲区a取下一条投递WSASend发送。
如此循环,单步跟踪,发送10次数据都正常,单正常运行时候,发送2次后在WSASend时候就有WSA_IO_PENDING发生,看了WSASend参数dwBytes的值是一个很大的数,按常理说GetQue完成了才发下一条,系统缓冲不应该还有数据呀,不应该出现WSASend呀,请高手解答。
10个包一组,10个包一组的调试。把服务器的发送流程print出来,自然就清楚了。
客户端采用Csocket OnRecice后recv到信息直接写文件,不做其它事情。
服务器端:线程A检测有没有发往客户端的信息,有的话就产生信息写入发送缓冲区a,判断该客户端SOCKET是否正在发送,如没有发送就PostQueuedCompletionStatus(m_hiocp, 0, (DWORD)lpmyio, &lpmyio->pSIOContext->ol); 通知完成端口开始发送数据。
完成端口GetQue返回后就检测发送缓冲区a有没有等待发送的数据,有就取得数据投递WSASend发送,等下次GetQue返回时候判断发送字节是否等于需要发送数据,如确认相等后就继续从发送缓冲区a取下一条投递WSASend发送。
如此循环,单步跟踪,发送10次数据都正常,单正常运行时候,发送2次后在WSASend时候就有WSA_IO_PENDING发生,看了WSASend参数dwBytes的值是一个很大的数,按常理说GetQue完成了才发下一条,系统缓冲不应该还有数据呀,不应该出现WSASend呀,请高手解答。-----------------------------------------------------------------------------------我是菜鸟,我来说一下,你看看我的意思.
你发送了,只是说你告诉系统去做这样一个IO操作,系统知道了之后,不一定立刻去做,但是他一定会去做,做完之后还会通知你做完了.这就是完成端口的作用.你发送了之后去看缓冲区肯定是有数据的,而且肯定会经常那个WSA_IO_PENDING错误的.这有什么不对呢?