函数WSARecvFrom接收数据的问题

galafx 2009-02-02 07:11:21
WSARecvFrom这个函数其中一个参数是lpBuffers:一个指向WSABUF结构数组的指针。

我在接收时只能接收到第一个WSABUF结构体发送过来的内容。

第二个WSABUF结构体的内容没有接收到。

其实也不能说没有接收到,应该是接收到了,而没有保存到第二个WSABUF结构体中。

发送接收都没有提示错误,而且发送字节和接收字节都一样。

本人小菜,研究了好久都不明白,下面是代码,大家帮忙看看哪里有问题。

谢谢大家


发送代码:

WSABUF buf[2];
DWORD dwSend;

SOCKADDR_IN addrSend;
addrSend.sin_addr.S_un.S_addr=inet_addr("192.168.1.188");
addrSend.sin_family=AF_INET;
addrSend.sin_port=htons(4567);

CString strBuf1;
CString strBuf2;
int len;

GetDlgItemText(IDC_EDIT_SEND1,strBuf1);
len=strBuf1.GetLength();
buf[0].buf=strBuf1.GetBuffer(len);
buf[0].len=len+1;

GetDlgItemText(IDC_EDIT_SEND2,strBuf2);
len=strBuf2.GetLength();
buf[1].buf=strBuf2.GetBuffer(len);
buf[1].len=len+1;

SetDlgItemText(IDC_EDIT_SEND1,"");
SetDlgItemText(IDC_EDIT_SEND2,"");

if(SOCKET_ERROR==WSASendTo(m_socket,buf,2,&dwSend,0,(SOCKADDR*)&addrSend,sizeof(SOCKADDR),NULL,NULL))
{
MessageBox("发送数据失败!");
return;
}
CString str;
str.Format("发送了%d个字节",dwSend);
MessageBox(str);


接收代码:

WSABUF buf[2];
buf[0].buf=new char[1024];
buf[0].len=1024;
buf[1].buf=new char[1024];
buf[1].len=1024;
DWORD dwRecv;
DWORD dwFlg=0;

int len=sizeof(SOCKADDR);
SOCKADDR_IN addrFrom;
if(SOCKET_ERROR==WSARecvFrom(m_socket,buf,2,&dwRecv,&dwFlg,(SOCKADDR*)&addrFrom,&len,NULL,NULL))
{
MessageBox("接收数据失败!");
return;
}

SetDlgItemText(IDC_EDIT_RECV1,buf[0].buf);
SetDlgItemText(IDC_EDIT_RECV2,buf[1].buf);

CString str;
str.Format("接收了%d个字节",dwRecv);
MessageBox(str);
...全文
476 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
luo_xuewu 2010-08-11
  • 打赏
  • 举报
回复
我也在为这个问题困扰,对于三楼的有点无语,在写程序的时候你会知道将来别人用这个程序来发送多少字节数据吗?难道是先知???
murongtianfeng 2010-03-31
  • 打赏
  • 举报
回复
你的问题在这里!

接收代码:

WSABUF buf[2];
buf[0].buf=new char[1024];
buf[0].len=1024;
buf[1].buf=new char[1024];
buf[1].len=1024;

你的接受buf[0]和buf[1] 长度都设置成1024了,你应该根据发送时 buf[0]和buf[1]的程度来设置!
galafx 2009-02-02
  • 打赏
  • 举报
回复
试验结果是这样的,希望能够帮助和我有同样困扰的人吧。

接收数据的时候不管发送多少个数据,接收时都会先往第一个结构体中填充,当天充满了才会想到第二个结构体。

不知道是函数哪里用错了,还是就这个样子的。

如果有人知道我哪里错了,请一定告诉我呀,先谢谢啦。
galafx 2009-02-02
  • 打赏
  • 举报
回复
新的发现,其实所有接收到的数据都存储到了buf[0].buf中

发送的时候少发送个\0结尾就能看出来了。

那么为什么所有接收到的数据都存储在buf[0].buf中呢。

函数WSARecvFrom(m_socket,buf,2,&dwRecv,&dwFlg,(SOCKADDR*)&addrFrom,&len,NULL,NULL)

中已经说明接收用的结构体是两个了呀。
封包助手(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创作助手写篇文章吧