2010-06-01 6 views
3
나는 다음과 같은 코드로 방송에 UDP 패킷을 보낼 우분투 9.10에서 BSD 소켓을 사용하고

: 모든 코드가 아닙니다UDP 소켓 (우분투 9.10)

 sock_fd = socket(PF_INET,SOCK_DGRAM,IPPROTO_UDP); 
     //sock_fd=socket(AF_INET,SOCK_DGRAM,0); 
     receiver_addr.sin_family = PF_INET; 
     //does not send with broadcast in ad hoc 
     receiver_addr.sin_addr.s_addr = htonl(INADDR_BROADCAST); 
     inet_aton("169.254.255.255",&receiver_addr.sin_addr); 
     receiver_addr.sin_port = htons(port); 
     int broadcast = 1; 
      // this call is what allows broadcast packets to be sent: 
      if (setsockopt(sock_fd, SOL_SOCKET, SO_BROADCAST, &broadcast, 
       sizeof broadcast) == -1) { 
       perror("setsockopt (SO_BROADCAST)"); 
       exit(1); 
      } 
     ret=sendto(sock_fd, packet, size, 0,(struct sockaddr*)&receiver_addr,sizeof(receiver_addr)); 

참고, 그것은 단지입니다 아이디어를 얻으려면.

인프라 무선 네트워크에 연결되어 있으면 프로그램에서 INADDR_BROADCAST를 사용하여 모든 데이터를 보냅니다. 그러나 랩탑이 ad-hoc 네트워크에 연결되어 있으면 모든 데이터를받을 수는 있지만 보내지는 못합니다. 169.254.255.255 브로드 캐스트 주소를 사용하여 문제를 해결했지만 무슨 일이 일어나고 있는지 알고 싶습니다.

미리 감사드립니다.

+0

"보내지 않음"은 함수가 오류를 반환하거나 네트워크의 다른 컴퓨터에서 패킷을 볼 수 없다는 의미입니다. –

+0

tcpdump 또는 wireshark를 시도하고 진행 상황을 알려주십시오. 패킷을 보낼 수 없다고 어떻게 결론 내릴 수 있습니까? – Jack

+0

-1 답신 ... 죄송합니다! – Ekhiotz

답변

2

두 개 이상의 어댑터 (유선 이더넷, WLAN)를 사용하고 있습니까?

제한된 브로드 캐스트 주소 (INADDR_BROADCAST)로 보내면 IP 스택이 첫 번째 어댑터를 사용하고 프레임을 보냅니다. 특정 어댑터를 선택하는 것에 대해 아무런 통제권이 없습니다. IP 스택은 발견 된 첫 번째 어댑터로 보낼 때 작업을 완료했습니다. 이 프레임이 라우터에 의해 막히지 않으면 전체 인터넷에 넘치게됩니다. 이것이 UDP 브로드 캐스트가 기본적으로 라우팅 할 수없는 이유입니다. (DHCP 릴레이에 구현 된 예외가 있습니다.)

특정 네트워크에서 UDP 프레임을 전송해야하는 경우 네트워크 브로드 캐스트 주소가 필요합니다. AUTOIP net에서 169.254.255.255로 보낼 때 이미이 작업을 수행했습니다.

setsocket (SOL_SOCKET, SO_BROADCAST)은 브로드 캐스트 전송을 허용하도록 소켓을 구성하기 만합니다.

관련 문제