想从sk_buff中获取ip地址、端口、协议,100分求解

colordancer 2010-10-08 05:09:01
我在练习做一个简单的linux包过滤防火墙
从struct nf_hook_ops结构hook函数得到的sk_buff

目前介绍sk_buff的文章很多,但大部分都一样的,好像最好的是去看《TCP/IP详解》,但是我的需求有限,资源有限,所以不想去深究了。

我要从sk_buff里获得以下信息:来源IP、端口,目标地址IP、端口,协议类别(UDP、TCP、ICMP等等)

请提供简单的代码(指针指向),要正确的,谢谢
...全文
1528 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
newjgh 2012-06-04
  • 打赏
  • 举报
回复
2.6怎么获取这些信息,求指点~
lovejoyy 2011-05-05
  • 打赏
  • 举报
回复
现在2.6的sk_buff 里面都不用nh等联合体了吧,都改成相对head的偏移量了
dingshaofengbinbin 2010-10-09
  • 打赏
  • 举报
回复
colordancer 2010-10-09
  • 打赏
  • 举报
回复 1
自己解决了:


struct sk_buff* sb=*skb;

unsigned int srcIp = sb->nh.iph->saddr;
unsigned int desIp = sb->nh.iph->daddr;
unsigned int protocal = skb->nh.iph->protocol;
struct tcphdr* pTcph=(struct tcphdr*)(sb->data+(sb->nh.iph->ihl*4));
unsigned int srcPort = pTcph->source;
unsigned int desPort = pTcph->dest;
colordancer 2010-10-09
  • 打赏
  • 举报
回复
已经获得ip和协议了,端口怎么获得呢?
没人帮忙吗
小魔菇 2010-10-08
  • 打赏
  • 举报
回复
[Quote=引用楼主 colordancer 的回复:]
我在练习做一个简单的linux包过滤防火墙
从struct nf_hook_ops结构hook函数得到的sk_buff

目前介绍sk_buff的文章很多,但大部分都一样的,好像最好的是去看《TCP/IP详解》,但是我的需求有限,资源有限,所以不想去深究了。

我要从sk_buff里获得以下信息:来源IP、端口,目标地址IP、端口,协议类别(UDP、TCP、ICMP等等)

请提供简……
[/Quote]
TCP/IP讲的是BSD的网络内核
SK_BUF是LINUX的
tangxianghenggood 2010-10-08
  • 打赏
  • 举报
回复
有个windows 下的,供参考,希望有帮助!
#include <winsock2.h>
#include <iostream>
using namespace std;
#include <string.h>

#pragma comment(lib, "ws2_32.lib")

void main(int argc, char *argv[])
{

const int DEFAULT_PORT = 5050;
const int DATA_BUFFER_LENGHT = 1024;
SOCKET locatesocket;
SOCKADDR_IN locateAddr,remoteAddr;//本地和远程主机地址
int locatePort,remotePort; //本地和远程套接字端口号
int err;
int iLen,iSend,iRecv;//远程端地址长度,发送数据长度,接收数据长度
char apply_Message[] = "I am a Client!\n"; //请求连接信息
char send_buf[DATA_BUFFER_LENGHT]="\0",recv_buf[DATA_BUFFER_LENGHT]="\0";//发送数据缓冲区,接收数据缓冲区
bool clientFlag = false ; //客户端标志,即请求方
WORD wVersionRequested;
WSADATA wsaData;

//根据参数设置相应的套接字参数
if (argc < 4) {
cout<<"Server waiting"<<endl;
if (argc < 2)
locatePort = DEFAULT_PORT;
else
locatePort = atoi(argv[1]);
} else {
locatePort = atoi(argv[1]);
remotePort = atoi(argv[3]);
remoteAddr.sin_family = AF_INET;
remoteAddr.sin_port = htons(remotePort);
remoteAddr.sin_addr.S_un.S_addr = inet_addr(argv[2]);
clientFlag = true;
}

//加载Winsocket动态库
wVersionRequested = MAKEWORD( 2, 2 );
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) {
cout<<"Failed to load Winsock.\n";
return;
}

//创建本地套接字
locatesocket = socket(AF_INET,SOCK_DGRAM,0);
if (locatesocket == INVALID_SOCKET)
{
cout<<"socket() Failed:"<<GetLastError()<<endl;
return ;
}

//设置本地套接字相关参数
locateAddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
locateAddr.sin_family = AF_INET;
locateAddr.sin_port = htons(locatePort);

err = bind(locatesocket,(SOCKADDR*)&locateAddr,sizeof(SOCKADDR));
if (err != 0)
{
cout<<"bind() Failed:"<<GetLastError()<<endl;
return ;
}

iLen = sizeof(remoteAddr);

//客户进程首先发送数据
if (clientFlag) {
iSend = sendto(locatesocket,apply_Message,strlen(apply_Message)+1,0,(SOCKADDR *)&remoteAddr,sizeof(remoteAddr));
if (iSend == SOCKET_ERROR)
{
cout<<"sendto() Failed:"<<GetLastError()<<endl;
} else if (iSend > 0){
cout<<"Message:"<<send_buf<<" have sent to "<<inet_ntoa(remoteAddr.sin_addr)<<":"<<ntohs(remoteAddr.sin_port)<<endl;
}
}

//循环处理双方数据传输
while (1)
{
iRecv = recvfrom(locatesocket,recv_buf,DATA_BUFFER_LENGHT,0,(SOCKADDR*)&remoteAddr,&iLen);
if (iRecv == SOCKET_ERROR)
{
cout<<"recvfrom() Failed:"<<GetLastError()<<endl;
break ;
}
else if (iRecv > 0)
{
cout<<"Receive:"<<recv_buf<<" From:"<<inet_ntoa(remoteAddr.sin_addr)<<":"<<ntohs(remoteAddr.sin_port)<<endl;
}
int my;
char buf[100];
my = (atoi( recv_buf))+1;
_itoa(my,buf,10);
strcpy(recv_buf,buf);
//cin>>send_buf;
iSend = sendto(locatesocket,recv_buf,strlen(recv_buf)+1,0,(SOCKADDR *)&remoteAddr,sizeof(remoteAddr));
if (iSend == SOCKET_ERROR)
{
cout<<"sendto() Failed:"<<GetLastError()<<endl;
break ;
} else if (iSend > 0){
cout<<"Message:"<<recv_buf<<" have sent to "<<inet_ntoa(remoteAddr.sin_addr)<<":"<<ntohs(remoteAddr.sin_port)<<endl;
}
}

//关闭套接字和清理系统资源
closesocket(locatesocket);
WSACleanup();
}

70,037

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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