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;
}