2009-11-24 5 views
1

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 호출을 차단합니다. 무슨 일 이니?

답변

1

패킷 요청을 보내기 전에 수신을 설정해야합니다. 그렇지 않으면 수신 준비가되기 전에 응답이 다시 나타납니다.

또한 응답 브로드 캐스트가 있습니까? 그렇지 않은 경우 현재 컴퓨터에 IP 주소가 할당되어 있지 않으면 호스트가 IP 주소로 수신 된 패킷을 필터링하여 응답의 대상이 될지 알 수 없으므로 수신하는 데 문제가있을 것입니다 (링크 계층 주소가 일치하더라도) 전달하지 않습니다.

하지만 내 생각에 첫 번째 문제입니다. 쓰레드를 사용하거나 비 차단 수신을해야합니다. 그렇지 않으면 수신 차단이 차단되므로 요청을 보내는 일은 결코 없을 것입니다.

0

나는 위의 대답에 동의하지 않습니다 .. recvfrom 두 패킷을받을 수 있어야합니다. 포트 번호가 1000의 범위 내에 있기 때문에 문제가 발생합니다. 일반적으로 이러한 패킷은 Linux 커널 (iptables)에 의해 필터링되고 전송되지 않습니다. 사용자 응용 프로그램. https://bugzilla.redhat.com/show_bug.cgi?id=983672

관련 문제