怎么抓取指定端口的数据包

YouHikari 2009-03-17 10:38:33
SOCKET ServerSock = socket(AF_INET,SOCK_RAW,IPPROTO_IP);
char buf[65535];

SOCKADDR_IN addrFrom;
int nLen=sizeof(SOCKADDR);
len = recvfrom( ServerSock, buf, sizeof( buf ), 0, ( sockaddr* )&addrFrom, &nLen );

上面是我的抓去函数和一些定义,在SOCKADDR_IN结构体中的addrFrom.sin_port是否是接受端口,如果是的话,为什么我接收的这个值都是0呢,还有里面的IP地址是否是发送端的IP地址,我是在局域网内调试的,数据包是网页和QQ发过来的,没有其他特定的端口程序.
...全文
1089 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
YouHikari 2009-03-17
  • 打赏
  • 举报
回复
0是代表系统分配端口吗?能知道分配的是那个端口吗?
YouHikari 2009-03-17
  • 打赏
  • 举报
回复
有没有人解惑啊?
liaoweixiaoyu 2009-03-17
  • 打赏
  • 举报
回复
顶下
weidong0210 2009-03-17
  • 打赏
  • 举报
回复
创建了一个套接字,在接收之前绑定到本地。
YouHikari 2009-03-17
  • 打赏
  • 举报
回复
还是没解决啊,快下班了,我说的详细点吧

首先,我想在一台服务器上,运行一个监控程序.

作用是监控某个端口发送和接受的数据包,然后对数据包进行分析.

可是现在的问题是我接受到的是所有端口的数据包,想要对数据包进行过滤,但是得到的端口全是0没法区分,不知道问题出在哪了

我用的是原始套接字.接受函数是:

recvfrom( ServerSock, buf, sizeof( buf ), 0, ( sockaddr* )&addrFrom, &nLen );

但是从addFrom.sin_port提取的端口全是0.
YouHikari 2009-03-17
  • 打赏
  • 举报
回复
40的包是不是也是无效的呢?还是小于40的都是无效的?
wangdan1600 2009-03-17
  • 打赏
  • 举报
回复
http://baike.baidu.com/view/569211.html
#include <winsock.h>
  int PASCAL FAR recvfrom( SOCKET s, char FAR* buf, int len, int flags,
  struct sockaddr FAR* from, int FAR* fromlen);
  s:标识一个已连接套接口的描述字。
  buf:接收数据缓冲区。
  len:缓冲区长度。
  flags:调用操作方式。
  from:(可选)指针,指向装有源地址的缓冲区。
  fromlen:(可选)指针,指向from缓冲区长度值。

注释:
  本函数由于从(已连接)套接口上接收数据,并捕获数据发送源的地址。
  对于SOCK_STREAM类型的套接口,最多可接收缓冲区大小个数据。如果套接口被设置为线内接收带外数据(选项为SO_OOBINLINE),且有带外数据未读入,则返回带外数据。应用程序可通过调用ioctlsocket()的SOCATMARK命令来确定是否有带外数据待读入。对于SOCK_STREAM类型套接口,忽略from和fromlen参数。
  对于数据报类套接口,队列中第一个数据报中的数据被解包,但最多不超过缓冲区的大小。如果数据报大于缓冲区,那么缓冲区中只有数据报的前面部分,其他的数据都丢失了,并且recvfrom()函数返回WSAEMSGSIZE错误。
  若from非零,且套接口为SOCK_DGRAM类型,则发送数据源的地址被复制到相应的sockaddr结构中。fromlen所指向的值初始化时为这个结构的大小,当调用返回时按实际地址所占的空间进行修改。
  如果没有数据待读,那么除非是非阻塞模式,不然的话套接口将一直等待数据的到来,此时将返回SOCKET_ERROR错误,错误代码是WSAEWOULDBLOCK。用select()或WSAAsynSelect()可以获知何时数据到达。
  如果套接口为SOCK_STREAM类型,并且远端“优雅”地中止了连接,那么recvfrom()一个数据也不读取,立即返回。如果立即被强制中止,那么recv()将以WSAECONNRESET错误失败返回。
  在套接口的所设选项之上,还可用标志位flag来影响函数的执行方式。也就是说,本函数的语义既取决于套接口选项,也取决于标志位参数。标志位可取下列值:


没用过winsock。长度为48的包是无效的包。
YouHikari 2009-03-17
  • 打赏
  • 举报
回复
我抓到好多长度是48的包,但是和其他抓包工具对比,其他包并没有抓到这些包,为什么,这些包是做什么的?

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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