免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: tqyou85
打印 上一主题 下一主题

DHCPOFFER数据包的问题 [复制链接]

论坛徽章:
2
巨蟹座
日期:2014-03-09 21:37:25射手座
日期:2014-04-16 16:23:03
11 [报告]
发表于 2008-10-16 19:26 |只看该作者
把这部分代码贴出来看看!

论坛徽章:
0
12 [报告]
发表于 2008-10-17 09:51 |只看该作者

回复 #11 kwest 的帖子

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <netdb.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <sys/wait.h>

#define SOCK_PORT 67

int main(int argc, char *argv[])
{
    struct hostent *he;
    struct sockaddr_in s_addr;
    struct sockaddr_in c_addr;
    int sockfd;
    int i;
    int addr_len;
    int len;
    unsigned char buf[1024]={'\0'};
    int yes = 1;
   
    if ((he=gethostbyname(argv[1])) == NULL)
    {
        herror("gethostbyname");
        exit(1);
    }
   
    /*create a new socket*/
    printf ("create socket\n");
    if((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1)
    {
        perror("socket");
        exit(1);
    }
   
    /*set to broadcast*/
    if (setsockopt(sockfd,SOL_SOCKET,SO_BROADCAST,&yes,sizeof(yes)))
    {
        perror("setsockopt function!\n");
        exit(1);       
    }
   
    /*set the client Info*/
    memset(&c_addr,0,sizeof(struct sockaddr_in));
    c_addr.sin_family = AF_INET;
    c_addr.sin_port = htons(SOCK_PORT+1);
    //c_addr.sin_addr.s_addr = INADDR_ANY;
    c_addr.sin_addr.s_addr = inet_addr("0.0.0.0");
   
    /*bind address to socket*/
    printf ("bind address to socket\n");
    if (bind(sockfd, (struct sockaddr *)&c_addr, sizeof(c_addr)) == -1)
    {
        perror("bind");
        exit(1);
    }
   
    /*set the server Info*/
    s_addr.sin_family = AF_INET;
    s_addr.sin_port = htons(SOCK_PORT);
    s_addr.sin_addr.s_addr = inet_addr("255.255.255.255");
   
    /*send data*/
    printf ("send data...\n");
    addr_len = sizeof(s_addr);
   
    unsigned char lpbuffer[245]=
                {
                  0x01,0x01,0x06,0x00,0x46,0x1d,0xe9,0xfb,0x00,0x00,
                  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
                  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,
                  0x3f,0x02,0x93,0x59,0x00,0x00,0x00,0x00,0x00,0x00,
                  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
                  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
                  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
                  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
                  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
                  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
                  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
                  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
                  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
                  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
                  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
                  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
                  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
                  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
                  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
                  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
                  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
                  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
                  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
                  0x00,0x00,0x00,0x00,0x00,0x00,0x63,0x82,0x53,0x63,
                  0x35,0x01,0x01,0xff,0x00
                };
               
    len = sendto(sockfd,lpbuffer,245,0,(struct sockaddr *)&s_addr,addr_len);
   
    if(len<0)
    {
        perror("sendto");
        exit(1);       
    }
    printf("sent %d bytes to %s\n",len,inet_ntoa(s_addr.sin_addr));

    sleep (1);
    /*get the server Info*/
    s_addr.sin_addr = *((struct in_addr *)he->h_addr);
    printf ("recv data...\n");
    len = recvfrom(sockfd,buf,strlen(buf),0,(struct sockaddr *)&s_addr,&addr_len);
    if(len<0)
    {
        perror("recvfrom");
        exit(1);       
    }   
    printf ("len: %d\n",len);
    for (i=0;i<len;i++)
    {
        printf ("%02x",buf);       
    }
    printf ("\n");
    printf("recv from:%s,%d\n",inet_ntoa(s_addr.sin_addr),ntohs(s_addr.sin_port));
   
    close(sockfd);
    return 0;
}

论坛徽章:
0
13 [报告]
发表于 2008-10-17 13:16 |只看该作者

回复 #12 tqyou85 的帖子

根据我的理解,dhcp给你发的offer信息,可能不能通过普通的套接字来接受,它有可能不是通过udp协议的,就如ping这个就是通过icmp这个协议来实现的。

可以考虑去试下原始套接字,我也在学习中。

[ 本帖最后由 andrew913 于 2008-10-17 13:19 编辑 ]

论坛徽章:
0
14 [报告]
发表于 2008-10-21 09:12 |只看该作者
原帖由 andrew913 于 2008-10-17 13:16 发表
根据我的理解,dhcp给你发的offer信息,可能不能通过普通的套接字来接受,它有可能不是通过udp协议的,就如ping这个就是通过icmp这个协议来实现的。

可以考虑去试下原始套接字,我也在学习中。


不用raw包有其他的方法么?

论坛徽章:
0
15 [报告]
发表于 2008-10-21 09:38 |只看该作者
原帖由 tqyou85 于 2008-10-21 09:12 发表


不用raw包有其他的方法么?


你去研究下源码,应该有办法的

论坛徽章:
0
16 [报告]
发表于 2008-10-21 11:05 |只看该作者
我前几天刚写了一个, 你的dhcp discover 为什么是固定的?
如果你想抓到dhcp offer 报文,还是用raw socket 吧

论坛徽章:
0
17 [报告]
发表于 2008-10-21 11:53 |只看该作者
原帖由 KLL 于 2008-10-21 11:05 发表
我前几天刚写了一个, 你的dhcp discover 为什么是固定的?
如果你想抓到dhcp offer 报文,还是用raw socket 吧


我现在只是简单测试看看服务器能否返回offer包,DISCOVER设置成固定的应该可以吧。
但是如果考虑系统性能的话,用raw socket会不会不好?
我之前是通过原始套接字编程接收到本机网卡上的数据帧或者数据包,这样是可以的,你是用的什么方法,请教一下

论坛徽章:
0
18 [报告]
发表于 2008-10-21 13:27 |只看该作者
我用的也是raw socket, 不过我这里对性能的要求不是很高

论坛徽章:
0
19 [报告]
发表于 2008-10-21 13:36 |只看该作者

回复 #18 KLL 的帖子

你就是用raw socket接收,然后通过源,目的IP地址,端口以及协议来判断的么?

论坛徽章:
0
20 [报告]
发表于 2008-10-21 13:56 |只看该作者
对,当然还有其它的一些字段,协议不同
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP