getservbyname()返回与给定服务名对应的包含名字和服务号信息的servent结构指针。
基本介绍
- 中文名返回对应于给定服务名和协定名的相关服务信息
- 外文名getservbyname()
- name一个指向服务名的指针。
- proto指向协定名的指针(可选)
简述
返回对应于给定服务名和协定名的相关服务信息。
#include <netdb.h>
struct servent getservbyname(const char name, const char proto);
name 一个指向服务名的指针。
proto 指向协定名的指针(可选)。如果这个指针为空,getservbyname()返回第一个name与s_name或者某一个s_aliases匹配的服务条目。否则getservbyname()对name和proto都进行匹配。
注释
getservbyname()返回与给定服务名对应的包含名字和服务号信息的servent结构指针。结构的声明如下
struct servent {
char s_name;
char s_aliases;
short s_port;
char s_proto;
};
结构成员
成员 用途
s_name 正规的服务名。
s_aliases 一个以空指针结尾的可选服务名伫列。
s_port 连线该服务时需要用到的连线埠号,返回的连线埠号是以网路位元组顺序排列的。
s_proto 连线该服务时用到的协定名。
返回的指针指向一个由Windows Sockets实现分配的结构。应用程式不应该试图修改这个结构或者释放它的任何部分。,每一执行绪仅有一份这个结构的拷贝,所以应用程式应该在发出其他Windows Scokets API调用前,把自己所需的信息拷贝下来。
返回值
如果没有错误发生,getservbyname()返回如上所述的一个指向servent结构的指针,否则,返回一个空指针。应用程式可以通过WSAGetLastError()来得到一个特定的错误代码。
错误代码
WSANOTINITIALISED 在套用这个API前,必须成功地调用WSAStartup()。
WSAENETDOWN Windows Sockets实现检测到了网路子系统的错误。
WSAHOST_NOT_FOUND 没有找到授权应答主机。
WSANO_DATA 有效的名字,但没有关于请求类型的数据记录。
WSAEINPROGRESS 一个阻塞的Windows Sockets操作正在进行。
WSAEINTR 阻塞调用被WSACancelBlockingCall()取消了.
参见: WSAAsyncGetServByName(), getservbyport()
例子
#include "netdb.h"#include "stdio.h"int main(){ struct servent se = NULL; int i = 0; se = getservbyname("domain", "udp"); if (!se) return -1; printf("name : %s\n", se->s_name); printf("port : %d\n", ntohs(se->s_port)); printf("proto : %s\n", se->s_proto); for (i = 0; se->s_aliases[i]; i++) printf("aliases : %s\n", se->s_aliases[i]); return 0; }
实现
Linux平台,从/etc/services档案中读取信息,一次读取name(如smtp),port(如25),proto(如tcp),alias(如mail,部分服务有,部分没有)。