DHCP 클라이언트를 만들고 싶다.
내 PC가 이미 아이피를 획득한상태에서
DHCP Request를 날리면 응용 프로그램단에서 Response를 받을 수 있는거냐?
아니면 패킷 스니핑 형태가 필요한거냐?
#include<stdint.h>
#include<stdio.h>
#include<ctype.h>
#include<stdlib.h>
#include<string.h>
#include<signal.h>
#include<sys/types.h>
#include<winsock2.h>
#pragma comment(lib,"ws2_32.lib")
#include<errno.h>
#include<time.h>
struct dhcpmessage
{
uint8_t op;
uint8_t htype;
uint8_t hlen;
uint8_t hops;
uint32_t xid;
uint16_t secs;
uint16_t flags;
uint32_t ciaddr;
uint32_t yiaddr;
uint32_t siaddr;
uint32_t giaddr;
char chaddr[16];
char sname[64];
char file[128];
char magic[4];
char opt[3];
};
void die(const char* buf)
{
printf("n%s", buf);
exit(0);
}
int main(int argc, char** argv[])
{
int sockfd,listenfd,connfd;
const int on=1;
struct sockaddr_in servaddr,cliaddr,rservaddr;
#ifdef WINSOCK_VERSION
WSADATA wsaData;
WSAStartup(WINSOCK_VERSION,&wsaData);
#endif
if((sockfd=socket(AF_INET,SOCK_DGRAM,0)) < 0)
die("socket");
if(setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,(char*)&on,sizeof(on)) < 0)
die("setsockopt");
if(setsockopt(sockfd,SOL_SOCKET,SO_BROADCAST,(char*)&on,sizeof(on)) < 0)
die("setsockopt");
memset(&servaddr,0, sizeof(servaddr));
memset(&cliaddr,0,sizeof(cliaddr));
cliaddr.sin_port = htons(68);
cliaddr.sin_family = AF_INET;
cliaddr.sin_addr.s_addr = htonl(INADDR_ANY);
if(bind(sockfd,(struct sockaddr*)&cliaddr,sizeof(cliaddr)) < 0)
die("bind");
servaddr.sin_port = htons(67);
servaddr.sin_family = AF_INET;
//servaddr.sin_addr.s_addr = inet_addr("255.255.255.255");
servaddr.sin_addr.s_addr = inet_addr("192.168.0.255");
struct dhcpmessage dhcpmsg;
memset(&dhcpmsg, 0, sizeof(dhcpmsg));
dhcpmsg.op = 1;
dhcpmsg.htype = 1;
dhcpmsg.hlen = 6;
dhcpmsg.hops = 0;
dhcpmsg.xid = htonl(1000);
dhcpmsg.secs = htons(0);
dhcpmsg.flags = htons(0x8000);
dhcpmsg.chaddr[0] = 0x00;
dhcpmsg.chaddr[1] = 0x23;
dhcpmsg.chaddr[2] = 0x1D;
dhcpmsg.chaddr[3] = 0xD6;
dhcpmsg.chaddr[4] = 0x32;
dhcpmsg.chaddr[5] = 0x4D;
dhcpmsg.magic[0]=99;
dhcpmsg.magic[1]=130;
dhcpmsg.magic[2]=83;
dhcpmsg.magic[3]=99;
dhcpmsg.opt[0]=53;
dhcpmsg.opt[1]=1;
dhcpmsg.opt[2]=6;
if(sendto(sockfd,(char*)&dhcpmsg,sizeof(dhcpmsg),0,(struct sockaddr*)&servaddr,sizeof(servaddr)) < 0)
die("sendto");
struct dhcpmessage recvdhcpmsg;
int rservlen = sizeof(rservaddr);
if(recvfrom(sockfd,(char*)&recvdhcpmsg,sizeof(recvdhcpmsg),0,(struct sockaddr*)&rservaddr,&rservlen) < 0)
die("recvfrom");
char *str = (char*)&recvdhcpmsg;
int i;
for(i=0;i<sizeof(recvdhcpmsg);i++)
printf("%d_",str[i]);
printf("n");
#ifdef WINSOCK_VERSION
WSACleanup();
#endif
return 0;
}
위키랑 RFC한 번은 보고 글 쓰라능
ㄴ 이미 봤거든? 모르면 짜져
IP를 응용프로그램으로? 어차피 네트워크 장비(ex 랜카드) 에서 아이피를 받아서 관리하고 있을텐데? 듀얼로 지원하는 장비가 아닌 이상에야 다시 받아오기 어려울껄? 거기다가 DHCP 기반이 맥어드레스이기 때문에 같은 맥으로 다시 request 날리면 AP가 기존걸 지울꺼야
ㄴ 그러니까 아이피 재요청이 아니고 그냥 몇가지 옵션 정보만 요청해서 받아 올수 있는가해서 물어본거야
기본적으로 DHCP가 Mac address 기반이기 때문에 맥이 같다면 새로운 주소 얻기는 불가능할듯?
새로운 주소 얻고 싶은게 아니라고 -_-
boardcast로 받으면 되잖어 아니면 dhcp replaying 방식으로 해보거나 가능하다는게 확실하면 끝까지 해볼텐데...이건 확신이 없으니 귀찮다.|49.1.***.***
DHCP는 IP와 관련된 내용인데.. \'그냥 몇가지 옵션 정보\'가 필요하다면, beacon frame을 받아서 분석하던가, Probe request를 날려도 될듯? 그 안에 필요한 정보가 모두 있다면...
그냥 wireshark로 bootp 캡쳐해서 내가 필요한 옵션만 실어서 보내면 될거 같다. ㅋㅋ