snmp代理程序

本文介绍了一个SNMP代理程序的运行参数及其功能。程序首先解析命令行参数,创建两个UDP套接字,然后不断接收管理机发送的SNMP包,解析并转发。在接收到数据包后,程序会解码SNMP报文,检查协议版本、社区字段等,并根据需要修改社区字段内容,最后重新封装SNMP包并转发到指定目的地。
摘要由CSDN通过智能技术生成

 

运行参数:./snmp_proxy 161 192.168.5.74 161      #./snmp_proxy [本地端口]  [转发目的IP] [转发目的Port]

 

程序分析:

 

if (argc == 4){ };else (); //解析命令行,得到listern端口及forward的IP/port

 

//创建两个udp socket,得到描述符

sock_recv = socket(AF_INET, SOCK_DGRAM, 0);

sock_send = socket(AF_INET, SOCK_RAW, IPPROTO_RAW);

 

//设置sock_send的状态选项

if( setsockopt(sock_send,IPPROTO_IP,IP_HDRINCL,&on,sizeof(on)) <0 )();

 

//清空监听,转发套接字结构体

memset((void *)&listen,0,sizeof(listen));

memset((void *)&forward,0,sizeof(forward));

/*

struct sockaddr_in listen,forward;

*/

 

//初始化listen结构体的本地IP及port

listen.sin_family = AF_INET;

listen.sin_port = htons(listenport);

listen.sin_addr.s_addr = htonl(INADDR_ANY);

 

//初始化forward(转发结构体)的IP及port,由命令行输入得到

forward.sin_family = AF_INET;

forward.sin_port = htons(forwardport);

if(inet_pton(AF_INET,argv[2],&forward.sin_addr) != 1 )();   //字符转网络地址,存在forward.sin_addr

 

//绑定listen的ip,port到sock_recv套接字

if (bind(sock_recv, (struct sockaddr *)&listen, sizeof(struct sockaddr_in)) == -1)

{exit(0)};

 

//一个循环体,接受管理机发送的snmp包,解析包,转发

while(1)

{

;

}

 

//清空sockaddr_in及snmp_packet结构体,获取其len

fromlen = tolen = sizeof(struct sockaddr_in);

memset(&from, 0, sizeof(from));

memset(&to, 0, sizeof(to));

memset(recv_buf,0,sizeof(recv_buf));    //nsigned char

memset(send_buf,0,sizeof(send_buf));

memset(&snmp,0,sizeof(struct snmp_packet));

 

//调用recvfromto不断接受数据包

int recvfromto(int s, void *buf, size_t len, int flags,

        struct sockaddr *from, socklen_t *fromlen,

        struct sockaddr *to, socklen_t *tolen)

{break;}

/*

参数:

s是sock_recv套接字描符

buf是recv_buf保存接受到的字符

len是sizeof(recv_buf)字符len

......

*/

 

//from,to内容暂时为空,判断from,to空间足够大,从s套接字里获取及ip/port

 

       if (to) {

                struct sockaddr_in si;

                socklen_t l = sizeof(si);

                ((struct sockaddr_in *)to)->sin_family = AF_INET;

                ((struct sockaddr_in *)to)->sin_port = 0;

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值