WSASend 的一个小问题,谢谢

Oversense 2002-11-02 03:46:44
WSASend调用的时候,要给他一个char* 的buf,调用完了,是不是马上可以把
这个buf清掉,或者删掉(delete)?
如果这样的话,底层的缓冲区满了,会怎么样?返回一个错误?什么样的错误?

MSDN里面有一句话
The array of WSABUF structures pointed to by the lpBuffers parameter is transient. If this operation is completed in an overlapped manner, it is the service provider's responsibility to capture these WSABUF structures before returning from this call. This enables applications to build stack-based WSABUF arrays.
但是它只是说了WSABUF这个结构可以马上清掉,没说里面的buf也可以马上清掉啊!

小小问题,大家多多指点
...全文
79 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
Oversense 2002-11-03
  • 打赏
  • 举报
回复
to huangbeyond:
WSASend的buf,是我new出来的,用完了,我就把它删掉WSASend是在一个函数里面调用的,所以buf必须是全局的(?).如果使用全局变量,如果要多次同时调用WSASend就麻烦了。
huangbeyond 2002-11-02
  • 打赏
  • 举报
回复
我的理解:
能不能立即删除,还要看你的SOCKET的"发送/缓冲区尺寸".如果发送/接收缓冲区设置为0,那么,底层DLL发送/接收数据时,采用"直接使用应用程序缓冲区数据",而不是缓冲模式下的"把数据从应用程序缓冲区,拷贝到系统缓冲区".这是我的一个理解,但是我觉得不够很严密.因为,这个"拷贝缓冲区",我不能判断是发生在"WSASend被调用"的瞬间,还是在"数据被实际发送/接收"的时候.

测试是否能够删除,可以采用一次发送大尺寸数据来测试.比如:把缓冲区设置128K,然后发送,同时删除.

但是,我更迷惑, Oversense (步步文) 为什么要在"WSASend被调用"之后删除缓冲区? 其实你完全在一次网络会话中调用多个"WSASend",而同时操纵这几个"WSASend"使用的缓冲区,使用全局变量,或者类成员数据吧.
Oversense 2002-11-02
  • 打赏
  • 举报
回复
而且不出错,是因为高速网络,所以网络慢的话,就不知道怎么样了
到底可不可以删了?迷惑
Oversense 2002-11-02
  • 打赏
  • 举报
回复
to everandforever(Forever):
问题是微软又说
On the sending side, applications use WSASend or WSASendTo to supply pointers to filled buffers and then agree not to disturb the buffers in any way until the network has consumed the buffer's contents.
......
A return value of SOCKET_ERROR coupled with an error code of WSA_IO_PENDING indicates that the overlapped operation has been successfully initiated and that a subsequent indication will be provided when send buffers have been consumed or when a receive operation has been completed.

也就是说WSA_IO_PENDING的时候,buf并没有被"消耗",所以不能动这些buf

这不是和前面说的矛盾了吗?
everandforever 2002-11-02
  • 打赏
  • 举报
回复
哦. 那就是我没有好好理解. 既然不会出错, 那就用吧.
Oversense 2002-11-02
  • 打赏
  • 举报
回复
to everandforever(Forever):
我也是这么理解的,但是微软说
The array of WSABUF structures pointed to by the lpBuffers parameter is transient. If this operation is completed in an overlapped manner, it is the service provider's responsibility to capture these WSABUF structures before returning from this call. This enables applications to build stack-based WSABUF arrays.
我也试验过很多次,马上删除好像没什么问题啊,关键是我两个同事都说
可以马上删掉
Oversense 2002-11-02
  • 打赏
  • 举报
回复
用完要清除我知道,关键是我不知道在什么地方清除,是在WSASend调用返回后马上清除,还是在得到完成通知(比如用完成端口,就可以在得到完成通知)的地方。发送的buf多大,可以自己设定的,如果发了很多次的数据到这个buf,但是底层还没有发出去,会怎么样?
everandforever 2002-11-02
  • 打赏
  • 举报
回复
你如果是用重叠模型, 完成端口的话, WSASEND返回时数据还没有发出, 当然不能DELETE了. 数据发完后应该有通知, 那时才DELETE.
wuxuan 2002-11-02
  • 打赏
  • 举报
回复
发送的buf在底层是一个队列,这个队列有一个管理规则来维护,如果超出内存限制,则会自动清除一部分buf.
wuxuan 2002-11-02
  • 打赏
  • 举报
回复
一般情况下,用完buf都要清除的,除非你要重复使用。
封包助手(PackAssist)自述文件



一、软件介绍

封包助手是一个能拦截网络应用程序数据包的纯绿色软件(压缩包不足400KB,无插件无病毒,不需安装),包括Send,Recv,WSASend,WSARecv,SendTo,RecvFrom,WSASendTo,WSARecvFrom。

封包助手还可以拦截Connect和Accept函数,使您能够知道您的网络程序何去何从。

封包助手也可以发送数据,并且支持繁杂的队列发送数据,使您调试网络程序更方便。

封包助手还支持算法接口,您可以自己编写算法(压缩包内有例程源代码),封包助手就可以加载,使您分析网络数据更加方便。



二、What's New

2008.3.6(VER:0.6 Beta Build 0306)

1、调整发送数据包的代码,使发送数据包稳定

2、修正界面快捷键冲突问题

3、修正发送队列导出文件错误问题


2007.12.06(VER:0.5 Beta Build 1206)

1、去掉拦截WSAConnect和WSAAccept功能(因这两个Api最后也是调用的Winsock1.0函数,故取消)

2、增加队列发送功能(可以发多包,且可以设置时间间隔,从文件读取内容)

3、增加快捷键启动,停止截包功能(可设置快捷键)

4、增加数据查找功能(Hex和Ascii均可查找)

5、发送数据界面调整

6、发送数据更准确,更快

7、修正一处指针引起的访问错误


2007.12.02(VER:0.4 Beta Build 1202)

1、不同颜色显示不同函数(可选)

2、列表自动下滚(可选)

3、不需双击查看数据包

4、关闭进程同时停止截包

5、发送数据窗口弹出方式改变

6、优化了窗口界面


2007.11.30(VER:0.3 Beta Build 1130)

1、重写内核,代码效率更高,更稳定

2、修正Hook出错导致截包失败的问题

3、修正过滤函数的错误

4、增加拦截Connect,Accept,WSAConnect,WSAAccept的功能(Connect类函数为连接函数,故不能取到自己的ip和端口)

5、增加Toolbar,方便使用

6、增加自动开缓冲功能(普通模式在一些特殊应用网络数据量很大时,列表内的数据可能会丢失,此功能可避免此问题


2006.4.6(VER:0.2 Beta Build 0406)

1、修正了Winsock1.0中的个别函数数据大小拦截错误的问题

2、修正了右键菜单发送数据错误的问题

3、增加了新开端口发送功能

4、调整了保存数据包的格式


2006.2.14(VER:0.1 Beta Build 0214)

1、第一发布版本,希望大家支持。。。



三、软件特点:

1、可拦截winsock2中所有发送接收函数
(如:send,recv,sendto,recvfrom,WSASend,WSARecv,WSASendTo,WSARecvFrom)

2、可拦截Connect,Accept,使您知道目标程序何去何从

3、可以发送数据

4、拦截准确,快速(不会出现丢包现象)

5、即时注入,方便快捷

6、无安装文件,解压缩即可使用

7、体积小巧(压缩包300KB)

8、支持算法导入,并且接口公开



四、使用方法:

1、打开软件,点击系统菜单中的打开进程

2、选中进程名称,点击确定

3、您已经可以对指定程序进行数据包拦截操作了

4、不拦截时,可以点击工具条的停止截包



五、注意事项:

1、本程序不得用于非法开发,谢谢合作

2、对于某杀软对本人的软件报毒一事,我不想做何解释,只能惊叹于其引擎的能力(见壳就报就算厉害了?)



2008.3.6
Written By Guozidi(郭子迪)
http://www.guozidi.cn
guozidi@gmail.com

18,357

社区成员

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

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