문제

LAN의 클라이언트가 구성없이 서버 응용 프로그램의 모든 인스턴스를 찾을 수있는 방법을 찾고 있습니다. 무언가를 직접 해킹하는 대신 기존 솔루션을 사용하고 싶습니다. 개인적으로, 나는 파이썬으로 끝나야하지만 다른 언어의 솔루션에 대해 기꺼이 들었습니다.

그래서 왜 내가 사용하지 않는가 아바이 또는 Openslp 또는 다른 Zeroconf/SLP 해결책? 글쎄, 몇 가지 추가 기준이 있으며, 앞서 언급 한 시스템이 그들과 일치하지 않는 인상을 받고 있습니다.

나는 다음과 같은 솔루션을 찾고 있습니다.

  • 유연한. 수퍼 유행 권한이 필요하지 않아야합니다. 즉, 포트> 1024 만 사용합니다.
  • 단단한. 단일 컴퓨터에서 동일하고 다른 서비스 유형의 여러 서비스를 허용하고 광고 서버가 중지되거나 충돌하는 인스턴스가 발생하는 경우에도 서비스를 계속 광고해야합니다.
  • 가지고 다닐 수 있는. 거의 모든 곳에서 또는 적어도 *BSD, Debian/Gentoo/Redhat/Suse Linux, Mac OS X, Solaris 및 Windows NT에서 실행해야합니다.
  • . 이상적으로는 하나의 파이썬 스크립트가 전체 솔루션입니다. 나는 주소 자동 구성이나 그와 비슷한 것에 관심이 없지만, 필요하지 않은 많은 기능이있는 솔루션을 수용 할 수는 없습니다. 또한, 일회성 설정은 엄격한 No-No입니다.

나는 다음과 같은 것을 기대합니다.

def registerService(service): # (type, port)
    if listen(multicast, someport):
        if fork() == child:
            services = [service]
            for q in queriesToMe():
                if q == DISCOVERY:
                    answer(filter(q.criteria, services))
                elif q == ADVERTISE and q.sender == "localhost":
                    services.append(q.service)
    else:
        advertiseAt("localhost", service)
도움이 되었습니까?

해결책

나는이 모든 기준과 일치하는 응용 프로그램/라이브러리 (현재 Python 및 CLI 인터페이스)를 썼습니다. 라고 불린다 Minusconf. 포킹도 필요하지 않습니다.

다른 팁

LAN에서 노드 검색을 위해 Twisted 및 UDP 멀티 캐스트를 사용했습니다. 그것이 당신도 도움이되기를 바랍니다.

이를 수행하는 방법을 설명하는 꼬인 문서에 대한 링크 :https://twistedmatrix.com/documents/current/core/howto/udp.html#auto3

다음은 Twisted의 코드를 기반으로 한 서버/클라이언트의 기본 구현입니다. 한 번 실행하면 스스로 대답하지만 모든 점검 코드와 추가 기능이 제거되어 읽기가 더 간단합니다.

from twisted.internet.protocol import DatagramProtocol
from twisted.internet import reactor

class MulticastPingPong(DatagramProtocol):
    MULTICAST_ADDR = ('228.0.0.5', 8005)
    CMD_PING = "PING"
    CMD_PONG = "PONG"

    def startProtocol(self):
        """
        Called after protocol has started listening.
        """
        # Set the TTL>1 so multicast will cross router hops:
        self.transport.setTTL(5)
        # Join a specific multicast group:
        self.transport.joinGroup(self.MULTICAST_ADDR[0])

        self.send_alive()

    def send_alive(self):
        """
        Sends a multicast signal asking for clients.
        The receivers will reply if they want to be found.
        """
        self.transport.write(self.CMD_PING, self.MULTICAST_ADDR)

    def datagramReceived(self, datagram, address):
        print "Datagram %s received from %s" % (repr(datagram), repr(address))

        if datagram.startswith(self.CMD_PING):
            # someone publishes itself, we reply that we are here
            self.transport.write(self.CMD_PONG, address)
        elif datagram.startswith(self.CMD_PONG):
            # someone reply to our publish message
            print "Got client: ", address[0], address[1]


if __name__ == '__main__':
    reactor.listenMulticast(8005, MulticastPingPong(), listenMultiple=True)
    reactor.run()

서버 앱뿐만 아니라 클라이언트 앱을 제어 할 수 있다고 생각합니다. 파이로 당신을 위해 잘 작동 할 수 있습니다.

유연한: 특권이없는 포트를 사용합니다.

단단한: 그것은 수년 동안 잘 유지되었습니다.

가지고 다닐 수 있는: 순수한 파이썬과 여러 플랫폼에서 잘 테스트되었습니다.

빛: 파이로는 당신이 얻는 것에 대해 가볍다고 생각합니다. 어쩌면 하나의 파이썬 스크립트를 요청하는 것은 네트워크 이름 지정 서비스에 비현실적일까요?

Pyro의 "원격 개체"패러다임을 실제로 사용하고 싶지 않더라도 이름 지정 서비스 만 사용할 수 있습니다.

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