使用 Service Location Protocol 自動化客戶機的管理

幫助網絡客戶機實現自治

Service Location Protocol(服務位置協議,SLP)是一個 Internet 標準 RFC,也是一套軟件框架,它允許網絡應用程序發現並配置網絡服務。您可以使用 SLP 來開發零配置的應用程序,並簡化網絡互連設備的管理。本文首先簡要介紹 SLP 及其架構的內容,然後使用一個開放源碼實現來展示該協議的用法。

M. Tim Jones ([email protected]), 資深首席軟件工程師, Emulex

2006 年 4 月 03 日

  • expand內容

服務發現(service discovery) 是在網絡環境中發現必須使用的服務的能力。例如,如果要在網絡上新安裝一個桌面系統,應該如何對這個系統配置郵件服務器、缺省網關(用來對本機之外的連接進行路由)或可用打印機呢?通常,這些都是信息都要向系統管理員進行諮詢,然後在每臺機器上手工進行配置 —— 考慮到網絡中的情況不可避免地會發生變化,這一耗時的過程需要反覆多次進行維護。

因此,當網絡上的服務被刪除或位置發生變化時,如果可以自動發現這些服務,您就可以看到這樣做的價值有多大。在本文中,我將向您介紹一種專門用於簡化該過程的協議 —— Service Location Protocol(SLP)—— 並深入介紹這種協議用來進行服務廣播和發現所採用的架構。

發現的歷史

服務發現是現代網絡中一個有趣的概念;如果仔細瞭解一下,您會發現這個協議現已投入實際應用。Dynamic Host Configuration Protocol(動態主機配置協議,DHCP)提供了第一級的服務發現功能,它不但可以提供 IP 地址租借功能,還可以進行 Domain Name Service(域名服務,DNS)標識,從而使域名等 URL 可以成功得到解析。

RFC 2782 對 DNS 進行了擴展,它允許對服務或協議進行查詢,並返回地址記錄(就是所發現的服務的地址)。這個 RFC 通常就稱作 DNS SRV(或 DNS for Service Discovery —— DNS SD)。與傳統的 DNS 將完整的域名解析成 IP 地址一樣,DNS SRV 也可以將服務/協議解析成 IP 地址。例如,下面的代碼:

_mail._tcp.mtjones.com
_ntp._udp.mtjones.com

所請求的就是域 mtjones.com 中基於 TCP 的 SMTP 郵件服務器的 IP 地址和基於 UDP(用戶數據報協議)的 NTP 時間服務器的 IP 地址。

您會發現有幾個以某種形式提供服務發現功能的協議。表 1 列出了幾種競爭技術。正如您可以看到的一樣,這個領域中有幾種競爭標準。有些是補充性的(例如當今非常常用的 DHCP 和 DNS ),另外一些是競爭性的(例如 SLP 和 UPnP(Universal Plug and Play))。

表 1. 可以提供某種形式的服務發現功能的協議
協議 說明
DHCP 動態主機配置協議(Dynamic Host Configuration Protocol,IETF 標準)
DNS 域名服務(Domain Name Service,IETF 標準)
ZeroConf 零配置 IP 網絡(Zero Configuration IP Networking,IETF 標準)
SSDP 簡單服務發現協議(Simple Service Discovery Protocol,IETF 標準,在 Microsoft® UPnP 中使用)
LDAP 輕量級目錄訪問協議(Lightweight Directory Access Protocol,IETF 標準)
NIS 網絡信息服務(Network Information Service)
Bonjour Apple® 計算機用於 ZeroConf 的名字(之前稱爲 Rendezvous
Jini Java™ 開放架構,其中包括動態發現功能(Sun Microsystems)
Salutation 服務發現協議(Salutation Consortium)
SLP 服務位置協議(Service Location Protocol,IETF 標準)

對於這些競爭標準瞭解這麼多已足夠。現在,讓我們開始深入介紹 SLP 的內容,瞭解一下它可以實現什麼功能,如何實現這些功能,以及如何應用到應用程序中。

SLP 架構

SLP 是應用程序在局域網(LAN)和廣域網(WAN)中使用的一種動態配置協議。作爲客戶機,SLP 可以用來使用服務類型和屬性(例如 printer 類型和 color 屬性)來尋找服務。作爲服務提供者,SLP 可以用來廣播服務以及具有某種特定屬性的可用服務。

SLP 也可以在很多架構中使用,包括集中架構和分散架構,前者使用一箇中心服務器來緩存服務廣播,後者廣播需要對每個查詢進行響應。

SLP 角色

下面讓我們首先了解一下啓用了 SLP 的網絡中的角色。SLP 的角色有三種:

  • 用戶代理(User-Agent,UA)
  • 服務代理(Service-Agent,SA)
  • 可選的 目錄代理(Directory-Agent,DA)

儘管此處給出了這些區別,但重要的是要了解一個應用程序既可以發出請求,也可以廣播服務,因此可以同時成爲 UA 和 SA。

UA 在 SLP 中是客戶機。UA 代表應用程序進行操作,用來標識網絡上的給定服務。UA 通過與 DA(如果可用)進行通信或直接與 SA 進行通信來實現這種功能。在探討 SLP 的組織時,我們將更詳細地介紹這個概念。

SA 代表在網絡上提供服務的應用程序進行操作。如果存在 DA,SA 就與這些可用服務進行通信,並將自己的位置告訴 DA。否則在生成請求時,SA 直接對 UA 進行響應。

最後,DA 在使用中心點進行廣播和查詢的 SLP 中是一個可選角色。如果存在 DA,SA 發送的服務廣播就在 DA 中進行緩存。然後當 UA 對服務進行查詢時,DA 就直接進行響應。擁有 DA 就意味着不必每個服務提供者都需要廣播服務。一個實體可以註冊服務來代表這些服務,從而最小化它們的負載。

SLP 組織

由於 DA 是 SLP 中的一個可選元素,因此 SLP 角色用來進行通信的方法可能會有很大的不同。但是首先,SA 和 UA 如何判斷 DA 是否真正存在呢?

發現網絡中的 DA 在 SLP 中可以通過兩種方法實現:

  • 第一種方法稱爲 主動 DA 發現(Active DA Discovery),即使用 SLP 自己來發現一個 DA 服務。UA 發出一個多播請求 service:directory-agent。接收到這個請求的 DA 直接使用自己的地址對 UA 進行響應。
  • DA 發現使用的第二種方法稱爲 被動 DA 發現(Passive DA Discovery)。在這種模式中,DA 週期性地發送 DA 廣播,從而使 UA 和 SA 瞭解 DA 的存在。如果對主動 DA 發現的 UDP 響應丟失,由被動 DA 發現所發出的週期性廣播即可自動解決這個問題。

雖然這種架構爲 SLP 增加了一點複雜性,但是如果不存在 DA,就可能會增加 SA 的負擔。

單播、廣播和多播 UDP

單播通信 發生在兩個端點之間(一點與另外一點之間)。廣播通信 描述的是一個端點到 LAN 中其他所有端點的通信。多播通信 則是指組內的端點之間的通信。

無 DA 的服務發現

下面讓我們從 SLP 的分散組織開始介紹。在這種技術中,網絡上沒有 DA;因此,UA 會直接與 SA 進行通信並處理請求。圖形化的描述請參見圖 1。由於不存在 DA,因此 SA 就不能緩存自己的服務,從而必須直接響應 UA 的請求。

圖 1. 無 DA 的服務發現
無 DA 的服務發現

從圖 1 中可以看出,UA 發送一個服務請求來標識所需要的服務。由於不存在 DA,因此這個請求是以多播的形式發出的。任何提供所請求的服務的 SA 都需要以單播響應的方式對 UA 進行響應。響應中標識了服務及其位置(地址和端口)。

有 DA 的服務發現

當可以在網絡上使用 DA 時,UA 和 SA 都直接與 DA 進行通信,發送自己的服務請求和廣播信息。DA 是通過被動或主動 DA 發現的方式來發現的。在如圖 2 所示的例子中,UA 和 SA 都是通過被動發現來尋找 DA 的(通過來 DA 發出的多播)。這種發現是以 DA 發出的一條 DAAdvert 消息進行通信的。

圖 2. 有 DA 的服務發現
有 DA 的服務發現

SA 將自己的服務廣播給 DA 所採用的方式如下:SA 向 DA 發送一條 SAAdvert 消息,DA 使用一條 SrvAck 消息進行響應,表示對接收到廣播進行應答。當 SA 知道 DA 的地址之後,SA 就可以採用 UDP 幀的形式將自己的請求通過單播通信發送給 DA。

UA 使用 SrvRqst 消息向 DA 請求某個服務的位置。DA 使用一個單播 UDP SrvRply 消息進行響應,其中包含了服務的地址和端口。

在大型的網絡中,使用 DA 是值得的,因爲這樣可以減少在網絡上發送的多播消息的數量。如果不使用 DA,所有的 DA 和 UA 都需要接收所有的多播消息;而大部分消息都是被忽略掉的(因爲自己並不是這條消息所發送的目標),因此主機的處理器資源就在很大程度上被浪費了。

定義服務

SLP 中的服務是通過服務 URL 來定義的。URL 的形式如下:

service:<service-type>://<addrspec>

其中 <service-type> 是正在廣播的服務的類型,而 <addrspec> 則是服務的位置(域名或 IP 地址和端口號)。例如,下面這個例子就廣播一個郵件服務器的地址:mail.com,端口是 25:

service:mail://mail.com:25

如果 UA 請求了 "service:mail" 位置,就會返回定義這個位置的服務 URL。注意這可能會返回多個服務,UA 負責確定使用哪一個。如果您只希望返回一個服務,那麼 SLP 提供了一種方法對搜索進行限制。這就是 範圍(scope),它允許您爲特定的用戶而對服務進行分段。

當 SA 廣播新服務時,可同時可選地在一個範圍中進行廣播。範圍只是一個用來標識特定區域的字符串。例如,如果您有兩個打印機,一個在一層,另外一個在二層,就可以將範圍定義爲 first_floor 和 second_floor。當 UA 請求 service:printer 時,就會應用特定樓層的範圍,從而將搜索結果限制爲特定樓層上(即在某個範圍內)的打印機。

您可以使用範圍來定義服務的近似性(例如同一層)或服務的管理所有權(例如 財會 或 銷售)。如果一個服務是共享的,那麼這個服務可能會使用不同的範圍被廣播多次。

SLP 消息

SLP 實現了很多消息,其中一些我們已經在圖 1 和圖 2 中展示過。除註冊和查找服務之外,SLP 還提供了一些消息用來註銷那些不在需要的服務,搜索所有基於某種類型的服務,以及請求某個特定服務的屬性。

表 2 定義了在 SLP 中使用的消息。我在這兒列出這些消息僅僅是爲了給出一個完整的列表;並不打算深入介紹它們。如果您使用帶有 SLP 插件的 Ethereal 協議分析器,就會看到這些消息及其解析的數據。

表 2. SLP 中的消息通信
消息 說明
SrvReg SA DA 註冊(廣播)服務
SrvDeReg SA DA 註銷服務
SrvAck DA SA 對 SrvReg 和 SrvDereg 消息進行響應
SrvRqst UA SA/DA 請求服務的位置
SrvRply SA/DA UA 響應對某個服務位置的 SrvRqst 請求
SrvTypeRqst UA SA/DA 根據已定義的類型來請求服務的位置
SrvTypeReply SA/DA UA 響應對某個服務位置的 SrvTypeRqst 請求
AttrRqst UA SA/DA 請求給定服務的屬性
AttrRply SA/DA UA 響應對某個具有某種屬性的服務 AttrRqst 請求
DAAdvert DA UA/SA DA 發出用來通知 UA 和 SA 它們的存在和位置的消息
SAAdvert SA UA SA 發出用來通知 UA 自己的存在和位置的消息

一個 SLP 實現:OpenSLP

OpenSLP 是 SLP 的一個開放源碼實現。其中包含了您可以用來編寫 SA 和 UA 使用的 API 庫。它還提供了一個 DA,名爲 slpd,這可以使用其配置文件 /etc/slp.conf 進行配置。

OpenSLP API 使用了一種回調架構。您可以使用一個 API 函數來生成請求;在 API 函數的上下文中,可以使用響應數據或狀態調用一個回調函數。表 3 給出了 OpenSLP 中提供的 API 函數及其用途。SLPRegSLPDereg 和 SLPFind* 函數都使用一個回調函數來返回自己的狀態和可選數據。

表 3. OpenSLP 庫的主要函數
函數 說明
SLPOpen 打開一個 OpenSLP API 實例
SLPClose 關閉一個 OpenSLP API 實例
SLPReg 註冊一個服務和 URL
SLPDereg 爲服務註銷一個 URL
SLPFindSrvs 查找已註冊的給定服務類型的服務
SLPFindSrvTypes 查找爲某個範圍註冊的所有服務類型

除了 API 庫之外,OpenSLP 還提供了 slptool,使用這個工具可以交互地執行大部分 SLP 的功能。這個工具對於註冊或查找服務來說非常有用。例如,下面的代碼就展示瞭如何查找一個日期查詢服務:

slptool findsrvs service:daytime
service:daytime://www.mtjones.com:45667,65535
$

參考資料 部分給出了更多有關 OpenSLP API 及其相關工具的資料的鏈接。

樣例用法

現在,讓我們來看幾個使用 OpenSLP API 的服務器和客戶機應用程序的例子。在這個例子中,我們創建了一個日期查詢套接字服務器:當客戶機連接到這個服務器上時,就打印一個字符串說明現在的時間。首先我們來討論應用程序的源代碼,然後再來看一下這兩個程序執行的情況。

啓用 SLP 的日期查詢服務器

清單 1 給出了啓用 SLP 的日期查詢服務器。我將源代碼分成 3 部分,這樣可以更簡單地介紹它們的功能:

  • 第 1 部分是一個簡單的套接字設置。
  • 第 2 部分執行服務註冊。
  • 第 3 部分實現了日期查詢服務。

第 1 部分用來建立日期查詢服務器使用的套接字。我創建了一個套接字,使用 setsockopt 爲這個套接字啓用地址重用功能,將一個地址和端口綁定到這個套接字上,最後通過調用 listen(這會將 TCP 服務器套接字設置成監聽狀態)來允許到達連接。

第 2 部分使用 OpenSLP API 來執行服務註冊功能。首先,我們使用 SLPOpen 創建一個新的 SLP 句柄,然後使用 SLPReg 來註冊這個服務。回想一下服務 URL 中包含了服務名(daytime),服務的位置(www.mtjones.com)以及訪問服務所使用的 TCP 端口號(45667)。在調用 SLPReg 回調函數(slpRegCallback)之後,SLPReg 函數就結束了,我們使用 SLPClose 來關閉 SLP 句柄。現在我們的服務已經在 DA 中註冊了。

服務註冊完成之後,我們接下來就要開始看第 3 部分的內容了,它實現了日期查詢服務器的功能。我們使用 accept 等待新連接到達;在接收到新客戶機連接時,我們獲得當前時間,將其轉換成一個字符串,並使用 write API 函數將其寫入客戶機套接字。客戶機關閉套接字,而服務器則繼續等待新的客戶機連接。

清單 1. 啓用 SLP 的 daytime 服務器
#include <stdio.h>
#include <slp.h>
#include <time.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <string.h>
#include <unistd.h>
#define MAX_BUFFER      80
void slpRegCallback( SLPHandle hslp, SLPError errcode, void *cookie )
{
  if (errcode == SLP_OK) {
    printf("Service registered\n");
  }
  *(SLPError *)cookie = errcode;
  return;
}
int main()
{
  SLPError err, callback_err;
  SLPHandle hslp;
  int servsock, clisock, on = 1;
  struct sockaddr_in sa;
  time_t t;
  char timeBuffer[MAX_BUFFER+1];
  /* --------------------------------------
   * Section 1 -- Daytime Server Setup
   * -------------------------------------*/
  /* Create a new socket */
  if ((servsock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
    perror("socket");
    return servsock;
  }
  /* Enable address reuse */
  if ((setsockopt( servsock, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on))) < 0) {
    perror("setsockopt");
    return -1;
  }
  /* Bind our socket to port 45667 and all interfaces */
  memset( &sa, 0, sizeof(sa) );
  sa.sin_family = AF_INET;
  sa.sin_port = htons(45667);
  sa.sin_addr.s_addr = htonl(INADDR_ANY);
  if (bind(servsock, (struct sockaddr *)&sa, sizeof(sa)) < 0) {
    perror("bind");
    return -1;
  }
  /* Place the socket into the listening state (able to accept new
   * connections).
   */
  listen( servsock, 5 );
  /* -------------------------------------------
   * Section 2 -- SLP Service Registration
   * ------------------------------------------*/
  /* Open an SLP API instance */
  err = SLPOpen( "en", SLP_FALSE, &hslp );
  if (err != SLP_OK) {
    printf("SLPOpen failed %d\n", err);
    return err;
  }
  /* Register the service with SLP */
  err = SLPReg( hslp, "service:daytime://www.mtjones.com:45667",
                 SLP_LIFETIME_MAXIMUM, 0, "", SLP_TRUE,
                 slpRegCallback, &callback_err );
  if ((err != SLP_OK) || (callback_err != SLP_OK)) {
    printf("SLPReg failed %d/%d\n", err, callback_err);
    return err;
  }
  /* Registration is complete, close the SLP instance */
  SLPClose( hslp );
  /* -------------------------------------
   * Section 3 -- Daytime Server Loop
   * ------------------------------------*/
  /* Service was successfully registered, start the daytime server.  */
  while (1) {
    /* Await a client connection */
    if ((clisock = accept( servsock, (struct sockaddr *)NULL, NULL)) < 0) {
      perror("accept");
      close(servsock);
      return clisock;
    }
    /* Get the time and send it to the client */
    t = time(NULL);
    snprintf( timeBuffer, MAX_BUFFER, "%s\n", ctime(&t) );
    write( clisock, timeBuffer, strlen(timeBuffer) );
    close( clisock );
  }
  close( servsock );
  return 0;
}

啓用 SLP 的日期查詢客戶機

我已經將啓用 SLP 的日期查詢客戶機劃分成了兩個函數(請參看清單 2)。第一個函數是 SLP 回調函數(用於 SLPFindSrvs 函數)第二個函數是實現日期查詢客戶機的 main 函數。

我們不會分別介紹這兩個函數,而是按照它們的流程來進行討論。main 函數被劃分成兩部分。main 函數的第 1 部分確定了 SLP 服務位置。在從 SLPOpen 中獲得新 SLP 句柄之後,我們會調用 SLPFindSrvs 來查找服務 service:daytime(使用範圍 default)。對這個 SLP 調用的回調函數是 slpSrvURLCallback。這個函數會對每個返回的服務都進行調用。在回調函數內部,我們對 SLPPL 返回的服務 URL 進行解析,並存儲這個服務的 IP 地址和端口號供以後使用。注意這裏使用的 slpSrvURLCallback 函數:本文附帶的 .ZIP 文件中可找到該函數,考慮到篇幅,此處不再給出詳細代碼。它惟一的用途就是將字符串域名解析爲 32 位 IP 地址。

在所有服務全部返回之後,控制從 SLPFindSrvs 返回給 main,並使用 SLPClose 關閉 SLP 句柄。然後檢查服務是否找到(使用上一次發現的服務);如果沒有找到服務,就退出。

最後一部分,即第 2 部分,是 daytime socket 的客戶機。使用通過 SLP 找到的 IP 地址和端口號,我新創建了一個 socket,並連接到服務器上。在連接之後,從 socket 中讀取信息,然後打印響應信息(當前時間)。

就是這樣!客戶機和服務器的 SLP 部分都非常小,在這個示例中幾乎是微不足道的。

清單 2. 啓用 SLP 的日期查詢客戶機
#include <stdio.h>
#include <slp.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <string.h>
#include <unistd.h>
#define MAX_BUFFER      80
int found = 0;
struct sockaddr_in sa;
int    port;
SLPBoolean slpSrvURLCallback( SLPHandle hslp, const char *srvurl,
                              unsigned short lifetime, SLPError errcode,
                              void *cookie )
{
  SLPSrvURL *parsedURL;
  SLPError  err;
  /* Check the callback for success */
  if (errcode == SLP_OK) {
    printf("srvurl = %s\n", srvurl);
    /* Parse the service string into its basic elements */
    err = SLPParseSrvURL( srvurl, &parsedURL );
    /* If the parse was successful, grab the necessary elements and
     * cache them for the application. */
    if (err == SLP_OK) {
      printf("Found %s\n", parsedURL->s_pcSrvType);
      printf("at host %s\n", parsedURL->s_pcHost);
      printf("port number %d\n", parsedURL->s_iPort);
      found = 1;
      /* Resolve the fully qualified domain name to an IP address */
      printf("Resolving host to IP address\n");
      if (resolve_name( &sa, parsedURL->s_pcHost ) == 0) {
        printf("Resolved to %s\n", inet_ntoa(sa.sin_addr));
        port = parsedURL->s_iPort;
      }
      SLPFree( (void *)parsedURL );
    }
    *(SLPError *)cookie = SLP_OK;
  } else if (errcode == SLP_LAST_CALL) {
    /* no action */
    printf("Final call -- slp find done.\n");
  } else {
    *(SLPError *)cookie = errcode;
  }
  return SLP_TRUE;
}
int main()
{
  SLPError err, callback_err;
  SLPHandle hslp;
  char timeBuffer[MAX_BUFFER+1];
  int sock, in;
  /* -------------------------------------
   * Section 1 -- SLP Service Request
   * ------------------------------------*/
  /* Open a new SLP API instance */
  err = SLPOpen( "en", SLP_FALSE, &hslp );
  if (err != SLP_OK) {
    printf("SLPOpen failed %d\n", err);
    return err;
  }
  /* Try to find the desired service */
  err = SLPFindSrvs( hslp, "service:daytime", "default", 0,
                      slpSrvURLCallback, &callback_err );
  if ((err != SLP_OK) || (callback_err != SLP_OK)) {
    printf("SLPFind failed %d/%d\n", err, callback_err);
    return err;
  }
  /* Close this SLP API instance */
  SLPClose( hslp );
  /* If the service wasn't found, exit now */
  if (!found) {
    close(sock);
    printf("Service not found.\n");
    return -1;
  }
  /* --------------------------------------
   * Section 2 -- Daytime Client Setup
   * -------------------------------------*/
  /* Create a new socket */
  if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
    perror("socket");
    return sock;
  }
  /* Bind the socket to the discovered service (address and port) */
  memset( &sa, 0, sizeof(sa) );
  sa.sin_family = AF_INET;
  sa.sin_port = htons(port);
  printf("Connecting to service\n");
  if (connect( sock, (struct sockaddr *)&sa, sizeof(sa)) < 0) {
    close(sock);
    perror("connect");
    return -1;
  }
  /* Read the time from the daytime server */
  in = read(sock, timeBuffer, MAX_BUFFER);
  timeBuffer[in] = 0;
  printf("Client received: %s\n", timeBuffer);
  close(sock);
  return 0;
}

展示服務器和客戶機的用法

清單 3 給出了服務器和客戶機運行時的情況。我們使用 make 工具來編譯 SLP 服務器和客戶機。接下來首先啓動 slpd 工具(SLP DA),然後啓動服務器(slpreg)。現在服務器正在運行,大概已經註冊了,我們使用 slptool 作爲一個可選步驟來查看 DA 現在是否知道這個服務的存在。從 slptool 的返回值中,我們知道註冊已經成功了,因此就嘗試啓動客戶機 slpfind。這個應用程序用來查找服務,然後在處理所生成的服務 URL 之後,連接到服務器上,並返回當前時間。

您可以從下面的 下載 部分中下載 slpregslpfind 和 makefile。

清單 3. 展示 SLP 服務器和客戶機的用法
# make
gcc -Wall -o slpreg slpreg.c -lslp
gcc -Wall -o slpfind slpfind.c -lslp
# slpd
# ./slpreg &
[1] 9275
Service registered
# slptool findsrvs service:daytime
service:daytime://www.mtjones.com:45667,65535
# ./slpfind
srvurl = service:daytime://www.mtjones.com:45667
Found service:daytime
at host www.mtjones.com
port number 45667
Resolving host to IP address
Resolved to 66.54.202.174
Final call -- slp find done.
Connecting to service
Client received: Sat Apr 16 14:04:26 2005
#

SLP 的將來

SLP 在很多公司的很多產品中都已經採用了。部分公司和產品如表 4 所示。

表 4. 集成 SLP 的產品
公司 產品
Axis Communication 網絡打印機和照相機
GroupLogic ExtremeZ-IP 文件 和打印機共享產品
IBM Communications Server;TotalStorage SAN Volume Controller;TotalStorage Multiple Device Manager (MDM);TN3270 Terminal
Open Door Networks Shareway IP 文件共享產品
Symantec Norton Personal Firewall for Macintosh
WBEM Solutions J WBEM Server

很多現代操作系統都包括了對 SLP 的支持,包括 GNU/Linux®、IBM AIX、HP-UX、NetBSD、Sun Solaris 8、Mac OS X 和 Novell SuSE Enterprise Server 9。現在您已經可以不僅僅是用 C 來爲 SLP 編寫應用程序了。SLP 已經綁定了幾種語言的支持,包括 C/C++、Java™ 和 Python。

最後,SLP 也可以在衆多推薦使用它的 RFC 中找到(例如 iSCSI 和 FCIP)。不論它集成到多少操作系統、產品中,可以支持多少種語言,都不代表 SLP 可以得到了更爲廣泛的接受。可以用來進行服務發現的協議的數量很大,但是現在尚沒有哪一個已經達到事實上的標準的狀態。

下載

描述 名字 大小
Demonstration SLP client and server l-slp-demo.zip 3KB
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章