wireshark를 사용하여 DHCP 패킷 구조를 확인했습니다. 이제 DHCPDISCOVER 요청을 만들어 '메시지'에 저장했습니다. 그런 다음 네트워크에서 브로드 캐스트합니다.DHCP 클라이언트가 포트 68에서 응답을받지 못했습니다.
sockfd = socket(AF_INET, SOCK_DGRAM, 0);
if (sockfd < 0) {
perror("socket");
exit(1);
}
setsockopt(sockfd,SOL_SOCKET,SO_BROADCAST, &on,sizeof(on));
setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR, &on,sizeof(on));
bzero(&cliaddr, sizeof(cliaddr));
cliaddr.sin_family = AF_INET;
cliaddr.sin_addr.s_addr = htonl(INADDR_ANY);
cliaddr.sin_port = htons(68);
if (bind(sockfd, (struct sockaddr *) &cliaddr, sizeof(cliaddr)) < 0) {
perror("bind");
exit(1);
}
bzero(&addr, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = inet_addr("255.255.255.255");
addr.sin_port = htons(67);
cnt = sendto(sockfd, message, sizeof(message), 0,(struct sockaddr *) &addr, sizeof(addr));
if (cnt < 0) {
perror("sendto");
exit(1);
}
addrlen = sizeof(servaddr);
cnt = recvfrom(sockfd, reply, sizeof(reply), 0,(struct sockaddr *) &servaddr, &addrlen);
if (cnt < 0) {
perror("recvfrom");
exit(1);
}
printf("\nReply Received\n");
이 프로그램을 실행하고 wireshark를 사용하여 보내고받은 패킷을 분석합니다. DHCPDISCOVER 패킷이 포트 67에서 전송되고 DHCPOffer 패킷이 wireshark 창에서 포트 68에서 수신됨을 알 수 있습니다. 내 클라이언트가 패킷을 제대로 보내지 만이 패킷을받지 못하고 recvfrom 호출을 차단합니다. 무슨 일 이니?