社区
网络编程
帖子详情
sniffer 能抓到包,为什么用recvfrom接收不到数据??
bobo55821912
2012-03-15 11:47:07
写了一个客户端程序,向服务器请求数据,用的是udp协议,socket编程。其中第一了两个套接字,sock1、sock2,其中sock1绑定1201端口负责向服务器发送请求命令;sock2绑定1202端口。现在用sniffer抓到服务器发送过来的数据包,发送到本地的1202端口。我再程序中写了recvfrom();接受数据,可是recvfrom返回值为零。求大侠指教!!!
...全文
470
11
打赏
收藏
sniffer 能抓到包,为什么用recvfrom接收不到数据??
写了一个客户端程序,向服务器请求数据,用的是udp协议,socket编程。其中第一了两个套接字,sock1、sock2,其中sock1绑定1201端口负责向服务器发送请求命令;sock2绑定1202端口。现在用sniffer抓到服务器发送过来的数据包,发送到本地的1202端口。我再程序中写了recvfrom();接受数据,可是recvfrom返回值为零。求大侠指教!!!
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
11 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
bobo55821912
2012-03-15
打赏
举报
回复
对代码做了简单注释:
//请求数据函数
DWORD WINAPI RequireImgData(LPVOID lpParameter)
{
SOCKET socket = (SOCKET)lpParameter;
sockaddr_in localaddr,RecvAddr,recvDataAddr;
char CommandData[45]={0};
long recvlen = 0;
char *recvimagedata = new char[RECVBUFFER]();
char *imagebuffer = new char[IMAGELEN_YUV422]();
long imagebuffersize = IMAGELEN_YUV422;
char *psave = NULL;
int n = sizeof(RecvAddr);
psave = imagebuffer;
//绑定发送命令套接字
localaddr.sin_family = AF_INET;
localaddr.sin_addr.S_un.S_addr = inet_addr("169.254.92.111");
localaddr.sin_port = htons(1092);
bind(socket, (sockaddr*)&localaddr, n);
//绑定接受数据套接字
SOCKET datasocket = ::socket(AF_INET, SOCK_DGRAM, 0);
recvDataAddr.sin_family = AF_INET;
recvDataAddr.sin_addr.S_un.S_addr = inet_addr("169.254.92.111");
recvDataAddr.sin_port = htons(1093);
bind(datasocket, (sockaddr*)&recvDataAddr, n);
//发送请求命令
Camera_Open(socket);
StreamGrabber_Open(socket);
StreamGrabber_PrepareGrab(socket);
AcquisitionStart_Execute(socket);
//接收数据
recvfrom(datasocket, CommandData, sizeof(CommandData), 0, (sockaddr *)&RecvAddr, &n);
do
{
recvlen = recvfrom(datasocket, recvimagedata, RECVBUFFER, 0, (sockaddr *)&RecvAddr, &n);
if(recvlen >8)
memcpy_s(psave, imagebuffersize, (recvimagedata + 8), recvlen - 8);
imagebuffersize -= recvlen;
psave += recvlen;
} while (imagebuffersize > 0);
::recvfrom(datasocket, CommandData, sizeof(CommandData), 0, (sockaddr *)&RecvAddr, &n);
closesocket(datasocket);
delete[] recvimagedata;
delete[] imagebuffer;
psave = NULL;
return 0;
}
//主函数
int _tmain(int argc, _TCHAR* argv[])
{
if(!InitSocket())
printf("InitSocket() ERR\n");
SOCKET s = ::socket(AF_INET, SOCK_DGRAM, 0);
//服务器信息
CameraAddr.sin_family = AF_INET;
CameraAddr.sin_port = htons(3956);
CameraAddr.sin_addr.S_un.S_addr = inet_addr("169.254.92.23");
DWORD dwThread;
HANDLE hThread = ::CreateThread(NULL,0, RequireImgData, (LPVOID)s, 0, &dwThread);//启动请求数据线程
//Sleep(1000);
system("pause");//等待
return 0;
}
许文君
2012-03-15
打赏
举报
回复
而你代码里面recvfrom了N次,
许文君
2012-03-15
打赏
举报
回复
你怎么知道recvfrom没收到数据
bobo55821912
2012-03-15
打赏
举报
回复
这是主要代码:
DWORD WINAPI RequireImgData(LPVOID lpParameter)
{
SOCKET socket = (SOCKET)lpParameter;
sockaddr_in localaddr,RecvAddr,recvDataAddr;
char CommandData[45]={0};
long recvlen = 0;
char *recvimagedata = new char[RECVBUFFER]();
char *imagebuffer = new char[IMAGELEN_YUV422]();
long imagebuffersize = IMAGELEN_YUV422;
char *psave = NULL;
int n = sizeof(RecvAddr);
psave = imagebuffer;
localaddr.sin_family = AF_INET;
localaddr.sin_addr.S_un.S_addr = inet_addr("169.254.92.111");
localaddr.sin_port = htons(1092);
bind(socket, (sockaddr*)&localaddr, n);
SOCKET datasocket = ::socket(AF_INET, SOCK_DGRAM, 0);
recvDataAddr.sin_family = AF_INET;
recvDataAddr.sin_addr.S_un.S_addr = inet_addr("169.254.92.111");
recvDataAddr.sin_port = htons(1093);
bind(datasocket, (sockaddr*)&recvDataAddr, n);
//发送请求命令
Camera_Open(socket);
StreamGrabber_Open(socket);
StreamGrabber_PrepareGrab(socket);
AcquisitionStart_Execute(socket);
//while (1)
//{
// Acquisition_Execute(socket);
//}
//接收数据
recvfrom(datasocket, CommandData, sizeof(CommandData), 0, (sockaddr *)&RecvAddr, &n);
do
{
recvlen = recvfrom(datasocket, recvimagedata, RECVBUFFER, 0, (sockaddr *)&RecvAddr, &n);
if(recvlen >8)
memcpy_s(psave, imagebuffersize, (recvimagedata + 8), recvlen - 8);
imagebuffersize -= recvlen;
psave += recvlen;
} while (imagebuffersize > 0);
::recvfrom(datasocket, CommandData, sizeof(CommandData), 0, (sockaddr *)&RecvAddr, &n);
closesocket(datasocket);
delete[] recvimagedata;
delete[] imagebuffer;
psave = NULL;
return 0;
}
int _tmain(int argc, _TCHAR* argv[])
{
if(!InitSocket())
printf("InitSocket() ERR\n");
SOCKET s = ::socket(AF_INET, SOCK_DGRAM, 0);
CameraAddr.sin_family = AF_INET;
CameraAddr.sin_port = htons(3956);
CameraAddr.sin_addr.S_un.S_addr = inet_addr("169.254.92.23");
DWORD dwThread;
HANDLE hThread = ::CreateThread(NULL,0, RequireImgData, (LPVOID)s, 0, &dwThread);
//Sleep(1000);
system("pause");
return 0;
}
ouyh12345
2012-03-15
打赏
举报
回复
代码?
cospos
2012-03-15
打赏
举报
回复
recvDataAddr.sin_addr.S_un.S_addr = inet_addr("169.254.92.111");
你要知接受本机的话应该是
inet_addr("127.0.0.1"); 169是内网私有,你很难查到问题出在哪
bobo55821912
2012-03-15
打赏
举报
回复
追问大家一个问题(解决了依旧给分):
为什么程序在recvfrom处一直阻塞,一直不返回,按道理不是2秒后返回吗?代码如下:
fd_set fdRead;
fd_set fdSocket;
FD_ZERO(&fdSocket);
// FD_SET(socket, &fdSocket);
FD_SET(datasocket, &fdSocket);
timeval timeout;
timeout.tv_sec = RESPONSETIME;//RESPONSETIME = 2
while (true)
{
fdRead = fdSocket;
int nRet = ::select(0, &fdRead, NULL, NULL, &timeout);
if(nRet >0)
{
for(int i = 0; i<(int)fdSocket.fd_count; i++)
{
if (FD_ISSET(datasocket, &fdRead))
{
if (fdSocket.fd_array[i] == datasocket)
{
::recvfrom(datasocket, CommandData, sizeof(CommandData), 0, (sockaddr *)&RecvAddr, &n);
do
{
memset(recvimagedata, 0, RECVBUFFER);
recvlen = ::recvfrom(datasocket, recvimagedata, RECVBUFFER, 0, (sockaddr *)&RecvAddr, &n);
if(recvlen >8)
memcpy_s(psave, imagebuffersize, (recvimagedata + 8), recvlen - 8);
imagebuffersize -= recvlen;
psave += recvlen;
} while (imagebuffersize > 0);
::recvfrom(datasocket, CommandData, sizeof(CommandData), 0, (sockaddr *)&RecvAddr, &n);
}
}
}
}
}
bobo55821912
2012-03-15
打赏
举报
回复
地址没有错误,本机地址是169.254.92.111
不太清楚为什么改成INADDR_ANY 就好了
gameslq
2012-03-15
打赏
举报
回复
[Quote=引用 7 楼 bobo5582191 的回复:]
通过把recvDataAddr.sin_addr.S_un.S_addr = inet_addr("169.254.92.111");
改成recvDataAddr.sin_addr.S_un.S_addr = INADDR_ANY;
解决了,谢谢各位!
[/Quote]
绑定地址错误?
bobo5582191
2012-03-15
打赏
举报
回复
通过把recvDataAddr.sin_addr.S_un.S_addr = inet_addr("169.254.92.111");
改成recvDataAddr.sin_addr.S_un.S_addr = INADDR_ANY;
解决了,谢谢各位!
bobo55821912
2012-03-15
打赏
举报
回复
循环次数由imagebuffersize控制的,debug调试中,recvfrom返回值为0,循环几次后进入等待。接收端口没有问题,sniffer抓包,服务器向本地的1093端口发送了数据。
一个简单的
sniffer
抓
包
程序
2字节的类型字段,表示封装在
数据
中的
数据
类型。
数据
:46-1500字节的
数据
字段。 帧尾 :4字节的帧效验序列。 +-------+--------------+----------------------------------------+------+ | D-MAC | S-MAC | TYPE ...
Linux下
sniffer
抓
包
程序程序的实现
Linux下
Sniffer
程序的实现作者:Gianluca Insolvibile整理:Seal(永远的FLASH)日期:2004-11-05嗅探——
Sniffer
技术是网络安全领域里一项非常重要的技术!对于“Hacker”来说,他们可以以非常隐蔽的方式得到网络中...
Python黑帽编程 4.1
Sniffer
(嗅探器)之
数据
捕获(上)
Python黑帽编程 4.1
Sniffer
(嗅探器)之
数据
捕获(上) 网络嗅探,是监听流经本机网卡
数据
包
的一种技术,嗅探器就是利用这种技术进行
数据
捕获和分析的软件。 编写嗅探器,捕获
数据
是前置功能,
数据
分析要建立在...
sniffer
超级详细介绍
有关
sniffer
及
sniffer
的含义
sniffer
s(嗅探器)几乎和internet有一样久的历史了.
Sniffer
是一种常用的收集有用
数据
方法,这些
数据
可以是用户的帐号和密码,可以是一些商用机密
数据
等等。随着Internet及电子商务的日益...
Linux下
Sniffer
程序的实现(PF_PACKET,SOCK_RAW,
recv
from,htons(ETH_P_IP),setsockopt(filter))
重点:ioctl设置网卡混杂模式,setsockopt设置
recv
from过滤剩下的IP报文的进一步具体过滤(BPF格式) 作者:Gianluca Insolvibile 整理:Seal(永远的FLASH) 日期:2004-11-05 嗅探——
Sniffer
技术是网络安全领域里一...
网络编程
18,356
社区成员
64,214
社区内容
发帖
与我相关
我的任务
网络编程
VC/MFC 网络编程
复制链接
扫一扫
分享
社区描述
VC/MFC 网络编程
c++
c语言
开发语言
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章