名字与地址转换getservbyname 与 getservbyport函数
服务也通常靠名字来标志,getservbyname函数用于根据给定名字查找相应服务。
#include
struct servent *getservbyname( const char *servname, const char *protoname );
成功:返回servent类型非空指针;
失败:空指针;
本函数返回非空指针
struct servent
{
char *s_name; // 服务的正是名字
char **s_aliases; // 别名列表
int s_port; // 服务端口号
char *s_proto; // 使用的协议
};
服务名参数servname必须指定。如果同时指定了协议(即protoname参数为非空指针),那么指定的服务必须有匹配的协议。有些因特网服务既用于TCP也用于UDP提供(如DNS)。如果protoname没有指定而servname指定服务支持多个协议,那么返回那个端口号取决于实现。一般来说,支持多个协议的服务旺旺使用相同的TCP端口号和UDP端口号。
servent结构中关心的主要是端口号。
注意:该端口号是以网络字节的顺序返回的,因此把它存放到套接口地质结构时绝对不能调用htons。
函数getservbyport用于根据给定端口号和可选协议查找相应的服务。
#include
struct servent *getservbyport( int port, const char *protoname );
成功:返回servent类型非空指针;
失败:空指针;
注意: port的值必须为网络字节序,如:
ptr = getservbyport( htons(53), "udp"); // DNS using UDP
示例代码:
int main(int argc, char** argv)
{
int sockFd,n;
char recvLine[MAXLINE + 1], addrStr[128],str[INET_ADDRSTRLEN];;
char **charpptr;
struct sockaddr_in servAddr;
struct in_addr **pptr;
struct in_addr *inetAddrP[2];
struct in_addr inetAddr;
struct hostent *hptr;
struct servent *sptr;
if(argc != 3)
{
ReportError("Usage : GetService ");
exit(1);
}
if((hptr = gethostbyname(argv[1])) == NULL)
{
if(inet_aton(argv[1], &inetAddr) == 0)
{
ReportError("hostName error for %s : %s",argv[1],hstrerror(h_errno));
exit(1);
}
else
{
inetAddrP[0] = &inetAddr;
inetAddrP[1] = NULL;
pptr = inetAddrP;
}
}
else //先打印host信息
{
printf("Official hostname : %s\n",hptr->h_name);
for(charpptr=hptr->h_aliases; *charpptr!=NULL; ++charpptr)
printf("\tAlias : %s\n",*charpptr);
switch(hptr->h_addrtype)
{
case AF_INET:
for(charpptr = hptr->h_addr_list; *charpptr!=NULL; ++charpptr)
printf("\tAddress : %s\n",
inet_ntop(hptr->h_addrtype, *charpptr, str, sizeof(str)));
break;
}
pptr = (struct in_addr**)hptr->h_addr_list;
}
if( (sptr = getservbyname(argv[2], "tcp")) == NULL)
{
ReportError("getservbyname error for %s",argv[2]);
exit(1);
}
printf("Official service name : %s\n",sptr->s_name);//打印service信息
for(charpptr=sptr->s_aliases; *charpptr!=NULL; ++charpptr)
printf("\tAlias : %s\n",*charpptr);
printf("\tPort number : %d\n",sptr->s_port);
printf("\tprotocol : %s\n",sptr->s_proto);
for(; *pptr != NULL; ++pptr)
{
if((sockFd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
{
ReportError("socket error");
exit(1);
}
bzero(&servAddr, sizeof(servAddr));
servAddr.sin_family = AF_INET;
servAddr.sin_port = sptr->s_port;//根据获取的服务信息设置端口号
memcpy(&servAddr.sin_addr, *pptr, sizeof(struct in_addr));//根据hostname信息设置IP
inet_ntop(AF_INET, (struct sockaddr*)&servAddr, addrStr,sizeof(servAddr));
printf("trying %s : %d\n", addrStr, servAddr.sin_port);
if(connect(sockFd, (struct sockaddr*)&servAddr, sizeof(servAddr)) == 0) //连接成功
break;
ReportError("connect error");
close(sockFd);
}
if(*pptr == NULL)
{
ReportError("unable to connet");
exit(1);
}
while( (n=read(sockFd, recvLine, MAXLINE)) > 0)
{
recvLine[n] = 0;
fputs(recvLine, stdout);
}
return 0;
}
连接被拒绝,不知道什么原因,难道是相应的服务没开启?
用service --status-all命令可以查看那当前运行的服务及其状态
[[email protected] bin]# service --status-all
abrtd (pid 1979) 正在运行...
abrt-dump-oops (pid 1987) 正在运行...
acpid (pid 1801) 正在运行...
atd (pid 2006) 正在运行...
auditd (pid 1679) 正在运行...
avahi-daemon (pid 1775) 正在运行...
用法:/etc/init.d/bluetooth {start|stop}
Stopped
cgred 已停
cpuspeed 已停
crond (pid 1995) 正在运行...
dnsmasq 已停
用法:/etc/init.d/firstboot {start|stop}
hald (pid 1810) 正在运行...
httpd 已停
表格:filter
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 ACCEPT all ::/0 ::/0 state RELATED,ESTABLISHED
2 ACCEPT icmpv6 ::/0 ::/0
3 ACCEPT all ::/0 ::/0
4 ACCEPT tcp ::/0 ::/0 state NEW tcp dpt:22
5 REJECT all ::/0 ::/0 reject-with icmp6-adm-prohibited
Chain FORWARD (policy ACCEPT)
num target prot opt source destination
1 REJECT all ::/0 ::/0 reject-with icmp6-adm-prohibited
Chain OUTPUT (policy ACCEPT)
num target prot opt source destination
表格:filter
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
2 ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0
3 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
4 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22
5 REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain FORWARD (policy ACCEPT)
num target prot opt source destination
1 REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain OUTPUT (policy ACCEPT)
num target prot opt source destination
irqbalance 已停
Kdump is not operational
mdmonitor (pid 1733) 正在运行...
messagebus (pid 1752) 正在运行...
模块 netconsole 未被加载
配置设备:
lo eth0
当前的活跃设备:
lo eth0
NetworkManager (pid 1763) 正在运行...
ntpd 已停
master (pid 1955) 正在运行...
进程记帐被禁用。
quota_nld 已停
rdisc 已停
restorecond (pid 2781) 正在运行...
rngd 已停
rsyslogd (pid 1695) 正在运行...
sandbox is stopped
saslauthd 已停
smartd 已停
openssh-daemon (pid 1879) 正在运行...
wpa_supplicant (pid 1812) 正在运行...