名字与地址转换getservbyname 与 getservbyport函数
名字與地址轉換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命令可以查看那當前運行的服務及其狀態
[root@localhost 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) 正在運行...
轉載于:https://www.cnblogs.com/rexienk/p/4856079.html
總結
以上是生活随笔為你收集整理的名字与地址转换getservbyname 与 getservbyport函数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 网络游戏外挂制作(3)
- 下一篇: 八股文写春联会是什么样子?