社区
网络编程
帖子详情
sniffer 能抓到包,为什么用recvfrom接收不到数据??
bobo55821912
2012-03-15 11:47:07
写了一个客户端程序,向服务器请求数据,用的是udp协议,socket编程。其中第一了两个套接字,sock1、sock2,其中sock1绑定1201端口负责向服务器发送请求命令;sock2绑定1202端口。现在用sniffer抓到服务器发送过来的数据包,发送到本地的1202端口。我再程序中写了recvfrom();接受数据,可是recvfrom返回值为零。求大侠指教!!!
...全文
620
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端口发送了数据。
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
技术是网络安全领域里一项非常重要的技术!对于“Hacker”来说,他们可以以非常隐蔽的方式得到网络中传输的大量的敏感信息,如Telnet,ftp帐...
Sniffer
一、将网卡设置在混杂模式 lonely@bogon:~/code/
sniffer
$ su密码:bogon:/home/lonely/code/
sniffer
# ifconfig eth0 promiscbogon:/home/lonely/code/
sniffer
# ifconfigeth0 Link encap:Ethernet HWaddr 00:0c:29:14:31:2c...
Vita Moonlight网络调试终极指南:使用WOL嗅探工具验证唤醒
包
想要在PlayStation Vita上流畅使用Vita Moonlight进行游戏串流,网络调试是关键环节!特别是Wake-on-LAN(WOL)网络唤醒功能,能让您直接从Vita唤醒远程PC开始游戏串流。本文将为您详细介绍如何使用内置的WOL嗅探工具验证唤醒
包
,确保网络唤醒功能正常工作。😊 ## 为什么需要WOL网络调试? Vita Moonlight作为PlayStation Vita
****************浅谈原始套接字 SOCK_RAW 的内幕及其应用(port scan, packet
sniffer
, syn flood, icmp flood)
二、SOCK_RAW 应用 1、packet
sniffer
C++ Code 1 2 3 4 5 6 7 sock_raw = socket(AF_INET , SOCK_RAW , IPPROTO_TCP); while(1) { data_size =
recv
from(sock_raw , b
TCP/IP学习--
sniffer
实作
目前大多数操作系统都为应用程序提供访问
数据
链路层的强大功能。这种功能可以提供如下能力: 1. 能够监视由
数据
链路层
接收
的分组, 使得诸如tcpdump等程序能够在普通计算机系统上运行,而无需实用专门的硬件设备来监视分组。如果结合实用网络接口进入混杂模式的能力,那么应用程序甚至能够监视本地电缆上流通的所有分组,而不仅仅是以程序运行所在主机为目的地的分组 2. 能够作
网络编程
18,356
社区成员
64,165
社区内容
发帖
与我相关
我的任务
网络编程
VC/MFC 网络编程
复制链接
扫一扫
分享
社区描述
VC/MFC 网络编程
c++
c语言
开发语言
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章