名字与地址转换getservbyname 与 getservbyport函数
名字與地址轉(zhuǎn)換getservbyname 與 getservbyport函數(shù)
服務(wù)也通常靠名字來標(biāo)志,getservbyname函數(shù)用于根據(jù)給定名字查找相應(yīng)服務(wù)。
#include
struct????servent *getservbyname( const char *servname, const char *protoname );
成功:返回servent類型非空指針;
失敗:空指針;
本函數(shù)返回非空指針
struct????servent
{
??????char??????*s_name;??????????//????服務(wù)的正是名字
??????char??????**s_aliases;??????//????別名列表
??????int???????s_port;???????????//????服務(wù)端口號
??????char??????*s_proto;?????????//????使用的協(xié)議
};
服務(wù)名參數(shù)servname必須指定。如果同時指定了協(xié)議(即protoname參數(shù)為非空指針),那么指定的服務(wù)必須有匹配的協(xié)議。有些因特網(wǎng)服務(wù)既用于TCP也用于UDP提供(如DNS)。如果protoname沒有指定而servname指定服務(wù)支持多個協(xié)議,那么返回那個端口號取決于實(shí)現(xiàn)。一般來說,支持多個協(xié)議的服務(wù)旺旺使用相同的TCP端口號和UDP端口號。
servent結(jié)構(gòu)中關(guān)心的主要是端口號。
注意:該端口號是以網(wǎng)絡(luò)字節(jié)的順序返回的,因此把它存放到套接口地質(zhì)結(jié)構(gòu)時絕對不能調(diào)用htons。
函數(shù)getservbyport用于根據(jù)給定端口號和可選協(xié)議查找相應(yīng)的服務(wù)。
#include
struct????servent *getservbyport( int port, const char *protoname );
成功:返回servent類型非空指針;
失敗:空指針;
注意: port的值必須為網(wǎng)絡(luò)字節(jié)序,如:
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;//根據(jù)獲取的服務(wù)信息設(shè)置端口號
????????memcpy(&servAddr.sin_addr, *pptr, sizeof(struct in_addr));//根據(jù)hostname信息設(shè)置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;
}
?
?
?
連接被拒絕,不知道什么原因,難道是相應(yīng)的服務(wù)沒開啟?
用service --status-all命令可以查看那當(dāng)前運(yùn)行的服務(wù)及其狀態(tài)
[root@localhost bin]# service --status-all
abrtd (pid??1979) 正在運(yùn)行...
abrt-dump-oops (pid 1987) 正在運(yùn)行...
acpid (pid??1801) 正在運(yùn)行...
atd (pid??2006) 正在運(yùn)行...
auditd (pid??1679) 正在運(yùn)行...
avahi-daemon (pid??1775) 正在運(yùn)行...
用法:/etc/init.d/bluetooth {start|stop}
Stopped
cgred 已停
cpuspeed 已停
crond (pid??1995) 正在運(yùn)行...
dnsmasq 已停
用法:/etc/init.d/firstboot {start|stop}
hald (pid??1810) 正在運(yùn)行...
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) 正在運(yùn)行...
messagebus (pid??1752) 正在運(yùn)行...
模塊 netconsole 未被加載
配置設(shè)備:
lo eth0
當(dāng)前的活躍設(shè)備:
lo eth0
NetworkManager (pid??1763) 正在運(yùn)行...
ntpd 已停
master (pid??1955) 正在運(yùn)行...
進(jìn)程記帳被禁用。
quota_nld 已停
rdisc 已停
restorecond (pid 2781) 正在運(yùn)行...
rngd 已停
rsyslogd (pid??1695) 正在運(yùn)行...
sandbox is stopped
saslauthd 已停
smartd 已停
openssh-daemon (pid??1879) 正在運(yùn)行...
wpa_supplicant (pid??1812) 正在運(yùn)行...
轉(zhuǎn)載于:https://www.cnblogs.com/rexienk/p/4856079.html
總結(jié)
以上是生活随笔為你收集整理的名字与地址转换getservbyname 与 getservbyport函数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 网络游戏外挂制作(3)
- 下一篇: Office365 - 如何在Andro