sniffer 能抓到包,为什么用recvfrom接收不到数据??

bobo55821912 2012-03-15 11:47:07
写了一个客户端程序,向服务器请求数据,用的是udp协议,socket编程。其中第一了两个套接字,sock1、sock2,其中sock1绑定1201端口负责向服务器发送请求命令;sock2绑定1202端口。现在用sniffer抓到服务器发送过来的数据包,发送到本地的1202端口。我再程序中写了recvfrom();接受数据,可是recvfrom返回值为零。求大侠指教!!!
...全文
470 11 打赏 收藏 转发到动态 举报
写回复
用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端口发送了数据。

18,356

社区成员

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

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