完成端口模型难题 忘得到高人指点

xuxian02092213 2008-07-29 02:41:12
在完成端口模型中,服务器个客户端发送一些消息,为了提高效率,我使用了循环来发送消息,如果WSARecv返回NO_ERROR,表明数据已经发送出去,可以发送下一个消息,返回WSA_IO_PEDING(可能是这样写的),表明数据还正在发送,这个时候要跳出循环,等发送结束后,再来继续发送。

我的问题是,无论发送返回 NO_ERROR还是 WSA_IO_PEDING,系统都会调用GetQueuedCompletionPort()函数,但是如上所说,发送过程中,由一个出现了WSA_IO_PEDING,那么就必须等发送结束后继续发送,什么时候结束,必须由GetQueuedCompletionPort()函数通知才可以知道,每一次投递WSARecv成功,都要调用一次GetQueuedCompletionPort()函数,那到底哪次投递是我出现WSA_IO_PEDING的那次投递的呢????

请教各位高手
...全文
108 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
xuxian02092213 2008-08-01
  • 打赏
  • 举报
回复
你的想法非常又道理,可以减少投递WSASend的次数,但是如果给数据打包会不会很麻烦,而且我也不知道怎么给数据打包,我是这个样子的,要发送的数据是在一个链表中,但是链表的地址并不一定是连续的,所以就不知道该怎么打包了啊,还麻烦你指点下,谢谢了
勇敢的天牛 2008-08-01
  • 打赏
  • 举报
回复
搞个Buff,memcpy呗,我是没别的办法了...
勇敢的天牛 2008-07-31
  • 打赏
  • 举报
回复
扩展完成结构
typedef struct _NODE_
{
OVERLAPPED cOverlapped;
int id;
...
} NODE;
WSARecv、WSASend都是非阻塞的,也就是即刻返回的函数,实际上数据还没收到(或发送)
无论发送和接收都由GetQueuedCompletionPort函数负责通知
判断扩展部分
switch(NODE::id)
{
case ...
}

这样就可以判断是那个完成操作了
勇敢的天牛 2008-07-31
  • 打赏
  • 举报
回复
接受用户A连接
接收用户A请求
启动工作线程,处理用户A请求
发送数据给用户A



1. 把用户A的数据进行打包,放到一个大的缓冲区里,一次性发送。
2. 发送包1,GetQueuedCompletionPort返回成功后,发送包2...
xuxian02092213 2008-07-31
  • 打赏
  • 举报
回复
我知道你的做法是判断一次GetQueuedCompletionPort是由于WSARecv引起还是WSASend引起的,确实是个好方法,不过我现在不是这个问题,我的问题是在listen后立即accept再WSARecv一次,通过GetQueuedCompletionPort判断接收数据成功,并且处理数据,处理的时候产生了一堆消息,消息产生了呢,就要发送,那么就需要使用WSASend发送消息,由于考虑效率问题,我在处理完接收数据并产生消息的时候用循环将消息循环发送出去,假设接收数据的时候GetQueuedCompletionPort的线程为A线程,在A线程中使用循环发送消息,WSASend()可能返回NO_ERROR或ERROR_PENDING两种,这两种都是正常的状态,如果是NO_ERROR的话,可继续在循环中发送数据,但是如果是ERROR_IO_PEDING的话,那么就要等到这个消息发送完成后记过了GetQueuedCompletionPort之后才可以继续发送(这个时候,这个线程可能已经不再是A线程了),现在就是如何判断经过GetQueuedCompletionPort的是刚刚发出ERROR_IO_PEDING的那个??????


多谢了啊

5,530

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 模式及实现
社区管理员
  • 模式及实现社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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