::WSASend发送数据的问题

windywalk 2004-12-30 05:39:18
在使用设个函数发送数据的时候,数据发送的频率较快,譬如我发送了10次数据这时WSASend也执行
了10次,但是监控网络上的数据的时候发现发出的数据是8次,其中有两次的数据是两个数据包累叠
而成的,大概是缓冲区的问题,但是关闭缓冲区会降低性能,又没有其他的方法可以解决这个问题
吗?使得能够正确的发送数据.
...全文
162 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
windywalk 2004-12-31
  • 打赏
  • 举报
回复
但是客户端接收使用单片机,flash非常有限,不可能使用太大的缓冲区
ilovevc 2004-12-31
  • 打赏
  • 举报
回复
这要什么解决的办法?这就是TCP的流的概念。你自己得处理记录边界的问题。例如搞个固定的包头,里面有长度等。
windywalk 2004-12-31
  • 打赏
  • 举报
回复
谢谢各位的提点,真的没有其他可以解决问题的方法吗?
oyljerry 2004-12-30
  • 打赏
  • 举报
回复

d fdff
流stream就会产生粘包的问题
ilovevc 2004-12-30
  • 打赏
  • 举报
回复
这就是TCP的流stream啊,没有边界。
DentistryDoctor 2004-12-30
  • 打赏
  • 举报
回复
这毕竟是个两难的问题,根据自己的需要进行取舍。
kingzai 2004-12-30
  • 打赏
  • 举报
回复
Scatter-Gather I/O
Scatter-gather support is a concept originally introduced in Berkeley Sockets with the functions recv and writev. This feature is available with the Winsock 2 functions WSARecv, WSARecvFrom, WSASend, and WSASendTo. It is most useful for applications that send and receive data that is formatted in a very specific way. For example, messages from a client to a server might always be composed of a fixed 32-byte header specifying some operation, followed by a 64-byte data block and terminated with a 16-byte trailer. In this example, WSASend can be called with an array of three WSABUF structures, each corresponding to the three message types. On the receiving end, WSARecv is called with three WSABUF structures, each containing data buffers of 32 bytes, 64 bytes, and 16 bytes.

When using stream-based sockets, scatter-gather operations simply treat the supplied data buffers in the WSABUF structures as one contiguous buffer. Also, the receive call might return before all buffers are full. On message-based sockets, each call to a receive operation receives a single message up to the buffer size supplied. If the buffer space is insufficient, the call fails with WSAEMSGSIZE and the data is truncated to fit the available space. Of course, with protocols that support partial messages, the MSG_PARTIAL flag can be used to prevent data loss.
phoenix_fei 2004-12-30
  • 打赏
  • 举报
回复
我也用过该函数,但是没有发现问题,谢谢你的提醒??我的看看我的代码了
结构层次及相互联系 (1)、工作线程:响应连接的IO投递返回并负责投递读请求,并将IO返回结果投递给处理线程,可设定参数决定工作线程数量; (2)、处理线程:处理线程调用回调函数将信息传递给应用层或协议栈,可设定参数决定工作处理数量; (3)、看守线程:响应Accept事件调用AcceptEx,检测连接和心跳超时 ,将信息投递给工作线程,模块仅有一个看守线程。 1. 技术要求 (1)、线程同步:Lock指令、临界段; (2)、主要Socket API:WSASend、WSARecv、AcceptEx、DisconnectEx; (3)、内存管理:连接池(句柄重用)、内存池; (4)、数据0拷贝:通过内置处理线程,上层应用可以避免自建线程池及复制数据的过程。同时提供GBuf内存分配功能,应用层获得分配地址及填充数据之后亦可直接投递给内核/驱动层; (5)、数据顺序同步:同一个连接同时只有一个处理线程响应其IO事件; (6)、IO请求投递:单投递读、多投递写; (7)、0缓冲读投递:可条件编译实现,以适用大规模连接要求。 (8)、超时机制:可设置空连接(连接不发送数据)超时时间以防止DOS攻击,也可设置心跳超时时间防止网络故障导致的现有连接成为虚连接避免耗尽系统资源。 (9)、接口技术:API、回调函数、客户句柄(客户连接句柄)。 (10)、主、被动发送:不使用HASH、MAP及LIST技术,即可提供安全可靠高效的客户连接句柄,以实现服务器端主被动发送数据功能; (11)、PerHandleData的回收不以IO投递的计数器或链表来做依据但仍能安全回收,同时尽量避免在高频的读写操作时做其他无关的操作以提高读写效率。 (12)、处理线程和工作线程有着良好分工界限,繁重的工作交给处理线程完成,工作线程工作量最大限度的减少,仅响应投递返回及读投递的操作; (13)、支持AWE,模块自动识别AWE是否开启(需手动开启),“否”则使用虚拟内存机制。 2. 功能要求 (1)、多IP多端口监听,每个监听可设置不同的回调函数,以高效的区别处理数据 (2)、可设置每秒最大的连接并发量和空连接(连接不发数据)超时时间以防止DOS攻击造成的服务瘫痪、具有心跳处理(防网络异常造成的虚连接)功能 (3)、不加协议的透明传输,可适用广泛的网络通讯环境 (4)、可现实主、被动发送数据,但不会因兼顾主动发送而额外增加降低效率的工作 (5)、内置处理线程,上层应用可不必自建线程池处理数据,所有IO事件按顺序调用回调函数并可以在回调函数内直接处理数据,不必担心多线程造成的接收数据乱序的问题。 (6)、高效率的数据对应关联机制,在初次连接并根据登录数据设置每个连接对应的宿主(Owner)之后,再接收的数据即可立即获得该连接对应的宿主,而不必再做额外的查询工作,并且模块内部采用的是指针关联方式,对于长连接、主动发送的服务器系统而言是高效率的。 (7)、可兼容IPv6 3. 注意事项 因硬件环境和应用环境不同,不合理的配置会出现效率及性能上的问题,因此以下情况出现时,请务必与作者联系以确保获得更好的参数配置: (1)、连接量超过1000个的。超过的应结合具体硬件配置和网络带宽等因素综合设定运行参数。 (2)、带宽使用率超过20%的。工作线程和处理线程数量的设置也是综合考虑数据吞吐量和数据处理负载的因素来设置的,过多的线程会在调度上浪费时间,同时也应该综合考虑线程优先级别来设置工作线程和处理线程数量,两者的设置也不一定能相等。 (3)、服务器端有主动发送需求的、短连接(含网络故障造成的连接断开)出现频率高的。 压力测试工具介绍: 一、 使用G-TcpClient模块 二、 可以设定间隔时间发起大规模长、短连接 三、 可以发起密集数据包,包括即时和定时发送,1M的光纤带宽最大可以达到100K/S(单向)以上,100M本地网最大可以达到10M/S(单向)以上 四、 数据发送仅由一个独立线程但当,每点击一次Connect就创建一个线程根据当前参数发起连接。 五、 测试前提:服务器接收客户端数据后立即原样返回给客户端
封包助手(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,356

社区成员

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

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