日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

名字与地址转换getservbyname 与 getservbyport函数

發布時間:2023/12/20 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 名字与地址转换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函数的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。