2013-10-29 6 views
0

우리는 소규모 네트워크에서 작동하는 몇 가지 임베디드 시스템을 보유하고 있으며이 중 일부는 물리적 디스플레이를 실행하며 일부는 임베디드 시스템의 네트워크 상태를 표시합니다. 우리는 지금까지 사용해온 무선 브리지를 더 이상 사용할 수 없으며 네트워크에서 다른 컴퓨터/무선 브리지를 감지하는 데 사용되는 이전 코드로 더 이상 작동하지 않는 새로운 브리지로 전환했습니다. 이전 코드는 다음을로컬 서브넷에서 사용 가능한 모든 컴퓨터 찾기

char broadcast[27] = { 1, 0, 0, 0, 0, 0, 0, 0, 0, 2, 10, 10, 60, 213, 69, 120, 1, 0, 192, 1, 1, 0, 1, 0, 1, 0, 1 }; 
sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); 
addr.sin_addr.s_addr = htonl(-1); 
addr.sin_port = htons(PORT); 
addr.sin_family = AF_INET; 
status = setsockopt(sock, SOL_SOCKET, SO_BROADCAST, &yes, sizeof(int)); 
status = setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int)); 
status = bind(sock, (struct sockaddr *) &addr, sinlen); // bind socket 
status = getsockname(sock, (struct sockaddr *) &addr, &sinlen); 
status = sendto(sock, broadcast, sizeof(broadcast), 0, (struct sockaddr *) &addr, sinlen); 

fd_set fds; 
struct timeval timeout; 

timeout.tv_sec = sec; 
timeout.tv_usec = usec; 

FD_ZERO(&fds); 
FD_SET(socket, &fds); 

select(socket+1, &fds, 0, 0, &timeout); 

status = recvfrom(sock, buffer, buflen, 0, (struct sockaddr *) &addr, &sinlen); 
some_addr = inet_ntoa(addr.sin_addr); 

나는 그것이 서브넷의 브로드 캐스트 주소로 UDP 브로드 캐스트 패킷을 전송이야 이해하지만 제가하지 않는 것은 F # $으로의 @ 가지고 마법 페이로드 것입니다 이것이 작동하고 왜 우리의 새로운 장비로 작동하지 않습니까?

이 코드를 바꾸려면 기본적으로 ping 192.168.1.0 -b 명령을 구현하여 ICMP 패킷을 사용하여 브로드 캐스트 주소를 ping하려고합니다. this question에 연결된 코드를 시도했지만 브로드 캐스트 주소에는 작동하지 않습니다 (아마도 그렇게 구성되지 않았기 때문일 수 있습니다). 내 질문에 다음 위의 질문에서 연결된 코드를 sendto 브로드 캐스트 주소로 구성하고 네트워크의 각 컴퓨터에서 결과를 수신하는 방법은 무엇입니까?

+0

간결함, 모든 오류 검사가 제거되었습니다. –

+0

'핑 -b'가 작동하는지 확인하기 위해서? 그렇지 않은 경우 코드가 아닌 네트워크 (장비)에 문제가있는 것일 수 있습니다. 어쩌면 브리징 중 일부가 브로드 캐스트 메시지를 차단하거나 무시할 수 있습니까? – Kninnug

+0

그래서 PORT 란 무엇입니까? –

답변

0

acksys에 의해 사용되는 독점적 인 프로토콜 일 수도 있습니다 - 그들은이 포트를 documentation에 언급합니다 (대부분의 다른 히트는 Logitech squeezebox와 관련이 있지만 관련이 없습니다).

[내가 직접 질문에 대답하고 있지 않다 실현,하지만 난이 위의 코드는 ACKSYS 하드웨어와 함께 작동된다는 것을 의미합니다 생각] 사람이 그것을 지적하기 전에, 코드가 위의 심각 명확성을 위해 냈다하고있다