WSASend的问题 急

fengge8ylf 2005-12-20 09:33:14
WSASend需要一个OVERLAPPEDPLUS结构 这个结构一定要new吗 我在栈上分配可以吗 我测试了一下在栈上分配 有时发送失败 但不敢确定是不是因为在栈上分配的
...全文
258 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
fengge8ylf 2005-12-21
  • 打赏
  • 举报
回复
burns79757975 正解 我也是这么想的
burns79757975 2005-12-21
  • 打赏
  • 举报
回复
只能在堆上分配,投递wsarecv或wsasend后会锁定所分配的内存。栈上分配内存发送有时会成功是因为内存还没被覆盖!!
fengge8ylf 2005-12-21
  • 打赏
  • 举报
回复
wsarecv不能用 wsasend就能用吗 如果一个在栈上分配 另一个在堆上分配 那么我pOverlapPlus  = (OVERLAPPEDPLUS*)lpOverlapped 这样还对吗 现在我测试的结果是如果在栈上分配有时GetQueuedCompletionStatus返回后lpOverlapped 是无效的指针 这种情况不是每次都出现 但是在堆上分配就没出现过这个问题
mme 2005-12-21
  • 打赏
  • 举报
回复
还有你说的wsarecv是绝对不能使用栈内存的。如果这样都能用栈内存,我就无语了
mme 2005-12-21
  • 打赏
  • 举报
回复
应该说,发送的时候系统会把你的数据复制一份到缓存里面,所以用栈也可以。
但是我怀疑是你发送的数据过大,缓存装不下,而栈内存被系统锁定,而函数退出又造成内存无效,才导致发送出错。

不过我的都是用堆内存(使用内存池)来发送数据的,所以没有发现出错的情况。
fengge8ylf 2005-12-20
  • 打赏
  • 举报
回复
在栈上分配的话 在GetQueuedCompletionStatus后 我就不能用pOverlapPlus = CONTAINING_RECORD(lpOverlapped, OVERLAPPEDPLUS, m_ol);了 出错 然后改成pOverlapPlus  = (OVERLAPPEDPLUS*)lpOverlapped 是可以的 为什么呢
fengge8ylf 2005-12-20
  • 打赏
  • 举报
回复
wsarecv呢 是不是在栈上分配也可以
nuaawenlin 2005-12-20
  • 打赏
  • 举报
回复
在堆上,栈上分配都可以

返回的错误值是什么

是WSAEWOULBLOCK这很正常

如果不是,查msn看看错误是不是由于参数错误引起
fengge8ylf 2005-12-20
  • 打赏
  • 举报
回复
怎么没人来呀
  • 打赏
  • 举报
回复
1. 事件通知
重叠I / O的事件通知方法要求将Wi n 3 2事件对象与W S A O V E R L A P P E D结构关联在一起。若使
用一个W S A O V E R L A P P E D结构,发出像W S A S e n d和W S A R e c v这样的I / O调用,它们会立即返回。
通常,大家会发现这些I / O 调用会以失败告终,返回S O C K E T _ E R R O R 。使用
W S A G e t L a s t E r r o r函数,便可获得与错误状态有关的一个报告。这个错误状态意味着I / O操作
正在进行。稍后的某个时间,我们的应用程序需要等候与W S A O V E R L A P P E D结构对应的事
件对象,了解一个重叠I / O请示何时完成。W S A O V E R L A P P E D结构在一个重叠I / O请求的初始
化,及其后续的完成之间,提供了一种沟通或通信机制。下面是这个结构的定义:










其中,I n t e r n a l、I n t e r n a l H i g h、O ff s e t和O ff s e t H i g h字段均由系统在内部使用,不应由应用
程序直接进行处理或使用。而另一方面, h E v e n t字段有点儿特殊,它允许应用程序将一个事
件对象句柄同一个套接字关联起来。大家可能会觉得奇怪,如何将一个事件对象句柄分配给
该字段呢?正如我们早先在W S A E v e n t S e l e c t模型中讲述的那样,可用W S A C r e a t e E v e n t函数来
创建一个事件对象句柄。一旦创建好一个事件句柄,简单地将重叠结构的h E v e n t字段分配给
事件句柄,再使用重叠结构,调用一个Wi n s o c k函数即可,比如W S A S e n d或W S A R e c v。
一个重叠I / O请求最终完成后,我们的应用程序要负责取回重叠I / O操作的结果。一个重叠
请求操作最终完成之后,在事件通知方法中, Wi n s o c k会更改与一个W S A O V E R L A P P E D结构
对应的一个事件对象的事件传信状态,将其从“未传信”变成“已传信”。由于一个事件对象
已分配给W S A O V E R L A P P E D结构,所以只需简单地调用W S AWa i t F o r M u l t i p l e E v e n t s函数,从
而判断出一个重叠I / O调用在什么时候完成。该函数已在我们前面讲述WSAEventSelect I/O模
型时介绍过了。W S AWa i t F o r M u l t i p l e E v e n t s函数会等候一段规定的时间,等待一个或多个事
件对象进入“已传信”状态。在此再次提醒大家注意: W S AWa i t F o r M u l t i p l e E v e n t s函数一次
最多只能等待6 4个事件对象。发现一次重叠请求完成之后,接着需要调用W S A G e t O v e r l a p p e d
R e s u l t(取得重叠结构)函数,判断那个重叠调用到底是成功,还是失败。该函数的定义如
fengge8ylf 2005-12-20
  • 打赏
  • 举报
回复
up
fengge8ylf 2005-12-20
  • 打赏
  • 举报
回复
但不敢确定是不是因为在栈上分配的原因
fengge8ylf 2005-12-20
  • 打赏
  • 举报
回复
mme(dog) 是你测试的结果吗?
mme 2005-12-20
  • 打赏
  • 举报
回复
如果是栈上分配的,你的函数退出造成栈内存无效,那会是什么情况呢!!!
fengge8ylf 2005-12-20
  • 打赏
  • 举报
回复
我想知道大家写的程序是在在栈上分配还是堆上分配
freemme 2005-12-20
  • 打赏
  • 举报
回复
一般是在堆上分配的

18,356

社区成员

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

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