2013-01-25 179 views
1

現在我有一些麻煩,在Linux Mint的每一次我設法得到它返回NULL端口,我不知道這可能是時間的函數getservbyname()爲什麼我的getservbyname函數總是返回NULL?

extern struct servent *get_port(char *name, char *prot) { 
     struct servent *tmp; 
     tmp = getservbyname(name, prot); 
     if(tmp == NULL) { 
     return NULL; 
     } 
     return tmp; 
    } 

這是我如何調用功能

struct servent *port; 

    if((port = (struct servent*)get_port("server", "tcp")) == NULL){ 
     perror("Error... \n"); 
     return -1; 
    } 
    printf("Got the port... \n"); 

我用perror函數來獲取有關問題的詳細信息,但我每次運行該代碼時我得到的功能工作正常...

+0

因此,您所查找的着名服務的名稱是「服務器」?有趣。我必須在我的/ etc/services文件中查看。不知道這是否存在(因此在「知名」的面前有所飛躍)。編輯:在我的服務文件中有超過8000個條目,沒有任何關於稱爲「服務器」的服務。這真的是你想要找到的名字嗎? – WhozCraig

回答

2

getservbyname()沒有設置errno,所以perror()不起作用。

如果它返回NULL那麼最可能的原因是您指定的服務不存在於服務文件中,或者服務文件無法打開。

的名字在你的例子"server"是不是一個會通常包含在服務數據庫 - 試圖查找服務就像"ftp"

+0

另請注意,雖然'getservbyname'應該在傳遞正確的服務名稱時起作用,但它已被'getaddrinfo'廢棄。 –

0

getservbyname手冊頁:

的getservbyname()的函數返回從使用 協議原相匹配的服務數據庫條目 一個servent結構。如果原型爲NULL,則將匹配任何協議。

/etc/services文件的結構如下:

echo  7/tcp 
echo  7/udp 
ftp   21/tcp 
smtp  25/tcp  

有可用的服務無論是在TCPUDP協議(呼應),而其他人在其中的一個只可(ftp,smtp)。所述getservbyname函數查詢/etc/services文件搜索服務名稱,並返回一個包含結構信息,諸如名字端口號協議別名

與您的代碼的問題,正如其他人已經指出的,是該函數的參數不是一個服務器名稱(如本地主機或其他),但你的服務名稱尋找(例如,ftp)。 proto參數是可選的,當其值爲NULL時,它匹配任何協議。有效的協議是tcpudp,以防你對其中一個特別感興趣。