우리는 소규모 네트워크에서 작동하는 몇 가지 임베디드 시스템을 보유하고 있으며이 중 일부는 물리적 디스플레이를 실행하며 일부는 임베디드 시스템의 네트워크 상태를 표시합니다. 우리는 지금까지 사용해온 무선 브리지를 더 이상 사용할 수 없으며 네트워크에서 다른 컴퓨터/무선 브리지를 감지하는 데 사용되는 이전 코드로 더 이상 작동하지 않는 새로운 브리지로 전환했습니다. 이전 코드는 다음을로컬 서브넷에서 사용 가능한 모든 컴퓨터 찾기
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
브로드 캐스트 주소로 구성하고 네트워크의 각 컴퓨터에서 결과를 수신하는 방법은 무엇입니까?
간결함, 모든 오류 검사가 제거되었습니다. –
'핑 -b'가 작동하는지 확인하기 위해서? 그렇지 않은 경우 코드가 아닌 네트워크 (장비)에 문제가있는 것일 수 있습니다. 어쩌면 브리징 중 일부가 브로드 캐스트 메시지를 차단하거나 무시할 수 있습니까? – Kninnug
그래서 PORT 란 무엇입니까? –