再次请教重叠IO模型的问题

ppyy 2003-11-21 05:47:00
请注意一下,我这里说的是采用完成例程的重叠IO模型,而不是完成端口。

经过几天的学习和看代码,以及自己写代码。。。现在我的问题主要有下面两个:
1、在同一个套接字上同时投递了WSARecv和WSASend请求,当这两个请求中的一个完成后,如何判断出是WSARecv 完成了还是 WSASend完成了?
2、我注意到在采用完成例程的重叠模型里,WSAEvent不需要和OVERLAPPED相关联,是不是意味着在管理多个套接字的时候也只需要创建一个WSAEvent来让WSAWaitForMultipleEvents等待?
...全文
24 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
sevencat 2003-11-22
  • 打赏
  • 举报
回复
class CBuffer : public OVERLAPPED
{
char buf[1460];
char operator_type;
unsigned long m_ref;
unsigned long m_offset;
}
这样的话估计基本上都能搞定了。
ppyy 2003-11-22
  • 打赏
  • 举报
回复
mahatma_cn(鱼和胸罩不可兼得):
谢谢
我去试一下
mahatma_cn 2003-11-21
  • 打赏
  • 举报
回复
看完成例程函数的第三个参数(可能是第四个参数,j-ft),这个参数就是你当初用WSASend或者WSARecv调用时指定的一个WSAOVERLAPPED结构!!!你可以改造这个结构如
typedef struct wsaoverlappedex
{
WSAOVERLAPPED ol;
IOType io; //枚举型,操作类型,每次WSASend & WSARecv时指定。
}WSAOVERLAPPEDEX,*LPWSAOVERLAPPEDEX;

这样在例程函数中接受这个参数,判断(LPOVERLAPPEDEX)lpOverlapped->io是否等于发送还是接受。

---------个人意见---------
ppyy 2003-11-21
  • 打赏
  • 举报
回复
phiger(phiger) :

能详细点说吗?
OVERLAPPED那个结构只有一个成员hEvent能使用的, 别的成员都是系统保留。,,,利用OVERLAPPED怎么判断?
谢谢
lostgdi731 2003-11-21
  • 打赏
  • 举报
回复
重载OnSend() & OnReceive()并加入全局判断标记,这样该可以达到你的目的吧?
phiger 2003-11-21
  • 打赏
  • 举报
回复
1.利用WSAOVERLAPPED结构在调用WSARecv和WSASend作标志
ppyy 2003-11-21
  • 打赏
  • 举报
回复
另外,大家觉得对收到的数据该在哪里处理好?
在WSAWaitForMultipleEvents返回WAIT_IO_COMPLETION后处理数据?或者在完成例程里处理数据?还是另外开一线程处理数据?我觉得另外开一线程处理数据比较好。。。因为WSAWaitForMultipleEvents返回WAIT_IO_COMPLETION后需要进入下一次循环继续等待下一个IO完成,,而如果在完成例程里处理的话,会延迟WSAWaitForMultipleEvents的返回。。。

18,356

社区成员

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

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