문제

내 Linksys 라우터는 컴퓨터 (PC 및 Mac 및 Linux)에 고정 된 로컬 IP를 할당하지 않기 때문에 매 순간마다 컴퓨터가 서로 업데이트되도록 스크립트를 작성하고 싶습니다.

http : //localhost/list.html

각 컴퓨터에는 모든 PC 및 Mac의 이름 목록과 Apache 서버에 대한 링크가 포함됩니다 ( http://192.168.1.102, 등)

로컬 IP 주소가 PC의 IpConfig와 Mac 및 Linux의 ifconfig에 의해 인식을 찾는 방법처럼 보이며 프로그래밍 방식으로 수행하려면 gethostbyName ()이됩니다.

그러나 나는 루비를 시도했다

irb(main):001:0> require 'socket'
=> true

irb(main):002:0> p Socket::gethostbyname("localhost")
["Core2Duo", [], 2, "\177\000\000\001"]

irb(main):005:0> p Socket::gethostbyname("core2duo")
["Core2Duo", [], 2, "\300\250\001g"]
=> nil

그리고 ipconfig는 실제로 보여줍니다

IPv4 Address. . . . . . . . . . . : 192.168.1.103

그래서 이것이 올바른 방법입니까? 루비에서 "ipconfig"를 실행하여 해킹하고 정규 표현식을 사용하여 결과를 얻을 수 있지만보다 표준적인 방법을 사용하는 것이 좋을 것입니다.

도움이 되었습니까?

해결책

Socket::getaddrinfo 당신이 찾고있는 것보다 더 많은 것일 수 있습니다.

Socket::getaddrinfo('localhost', 'http')
[["AF_INET", 80, "localhost", "127.0.0.1", ...]]

Socket::getaddrinfo('core2duo', 'http')
[["AF_INET", 80, "Core2Duo", "192.168.1.103", ...]]

또는 그냥 시도 할 수도 있습니다.

Socket::getaddrinfo('core2duo', 'http')[0][3]
"192.168.1.103"

다른 팁

다음을 사용하여 Java로 수행 할 수 있습니다.

Socket s = new Socket();
s.getLocalSocketAddress();

Windows 시스템에서 Bonjour를 실행하고 Linux 시스템에서 Avahi를 실행하면 각 시스템의 IP 주소를 결정해야합니다. 그런 다음 "hostname.local". 더 많은 정보 여기.

왜 해당 기계의 DHCP를 끄고 고정 IP 주소를 지정하지 않겠습니까?

댓글에 대한 응답으로 편집 : 최소한 3 년 정도 전에 (마지막으로 라우터를 구입했을 때) Linksys 라우터를 사용하면 내장 DHCP 서버의 하단 IP 주소를 설정할 수있었습니다. 그런 다음 개별 머신의 네트워크 설정으로 이동하여 DHCP를 비활성화하고 물리적 주소를 지정합니다. 예를 들어, 내 홈 네트워크에서 라우터는 192.168.1.1이고, 지식은 1.2이고, 프린터는 1.3이고, Linux 상자는 1.99이고 라우터는 1.100 이상을 제공하도록 구성되어 있습니다.

루비 스크립트의 문제점은 네트워크에 DNS 이름 해상도가 없다는 것일 수 있습니다. 이는 자체 이름 검색 프로토콜이 있기 때문에 일반적으로 컴퓨터간에 물건을 공유하는 경우 종종 숨겨집니다.

이름/IP 정보가 포함 된 데이터 그램을 방송하려는 경우 자체 IP 주소를 알기 위해 PC가 필요하지 않습니다. 이름이 포함 된 데이터 그램을 보내고 사용하십시오. recvfrom () - 또는 등가 - 다른 PC에서 잡을 수 있습니다. 이렇게하면 수신기가 발신자의 IP 주소를 recvfrom () 기능.

보너스로, 전송 PC에 하나 이상의 네트워크 어댑터가있는 곳에서 작동해야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top