getservbyname()函數與getserbyport()函數都是用來獲取服務的信息。該信息用servent結構表示。
1 servent結構
servent結構的定義爲
typedef struct servent {
char *s_name
; char **s_aliases
} SERVENT, *PSERVENT, *LPSERVENT;
其中,變量s_name指向服務名,s_aliases保存了指向服務別名的指針。
2 getservbyname()函數
getservbyname()函數的作用是通過服務名來獲取服務的信息。該函數的格式爲
servent * getservbyname( const char *name, const char *proto );
其中,參數name指向了服務名;proto指向了協議類型。如果成功執行,getservbyname()函數返回保存了服務信息的指針。
servent* pServent_name;
pServent_name = getservbyname("domain", NULL);
其中,參數“domain”指定了服務名,NULL表示返回獲取到的第一個服務信息。此時pServent_name指向的獲取到的服務信息。
3 getservbyport()函數
getservbyport()函數的作用是通過服務的端口來獲取服務的信息。該函數的格式爲
servent * getservbyport( int port, const char *proto );
其中,參數port是服務對應的端口號,需要注意的是該端口是網絡字節序格式;proto指定了服務的協議類型。如果成功執行,getservbyport()函數返回保存了服務信息的指針。
servent *pServent_port;
pServent_port = getservbyport(htons(13568), "tcp");
其中,13568是服務對應的端口號,“tcp”是服務的協議類型。獲取到的服務信息就保存在pServent_port指定的地址中。
4 所需頭文件和庫文件
需要注意的是,使用getservbyname()函數與getserbyport()函數時,需要指定其所需的頭文件和庫文件。
#include <winsock.h>
#pragma comment(lib, "Ws2_32.lib")