文章目录
-
-
- 0. 服务结构 (struct servent)
- 1. 函数 getservbyname()
- 2. 函数 getservbyport()
-
0. 服务结构 (struct servent)
服务结构用于存储或返回给定服务名称的名称和服务编号。
typedef struct servent {
char *s_name;char **s_aliases;
#if ...char *s_proto;
#if ...short s_port;
#elseshort s_port;
#endif
#elsechar *s_proto;
#endif
} SERVENT, *PSERVENT, *LPSERVENT;
成员
s_name
服务的正式名称。
s_aliases
备用名称的NULL终止数组。
s_proto
联系服务时要使用的协议的名称。
s_port
可以联系服务的端口号。端口号按网络字节顺序返回。
1. 函数 getservbyname()
getservbyname函数检索与服务名称和协议对应的服务信息。
servent * getservbyname(const char *name,const char *proto
);
参数
name
指向空端终止服务名称的指针。
proto
指向空终止协议名称的指针。如果此指针为NULL
,getservbyname 函数将返回第一个服务条目,其中名称与服务结构的 s_name 成员或服务结构的 s_aliases 成员匹配。否则,getservbyname与名称和原型匹配。
详情请参考:getservbyname 函数 (winsock. h)
代码展示:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <winsock2.h>
#include <ws2tcpip.h>
#include <windows.h> // 此头文件放在<winsock2.h>或<ws2tcpip.h>之后
#pragma comment(lib, "ws2_32.lib") //连接静态库int main(int argc, char** argv)
{
WSADATA wsaData; // 创建WSADATA的对象,存放socket版本号等信息int iResult; // 接收WSAStarup()函数的返回值char* serv_name;struct servent* remoteServ;/* -------------------------*/// 注册套接字iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);//与操作系统确认支持的WinSock版本if (iResult != 0) {
printf("WSAStartup failed: %d\n", iResult);return 1;}char buff[128] = "";printf("请输入服务名:\n");while (~scanf("%s",buff)){
serv_name = buff;printf("打印 %s 服务内容:\n", serv_name);remoteServ = getservbyname(serv_name, NULL);printf("服务名: %s \n", remoteServ->s_name);printf("端口号: %d \n", ntohs((u_short)remoteServ->s_port)); // 注printf("协议名: %s \n", remoteServ->s_proto);}/* -------------------------*/// 释放资源iResult = WSACleanup();if (iResult != 0) {
printf("WSACleanup failed: %d\n", iResult);return 1;}return 0;
}
输出效果:
2. 函数 getservbyport()
getservbyport函数检索与端口和协议对应的服务信息。
servent * getservbyport(int port,const char *proto
);
参数
port
服务端口,按网络字节顺序排列。
proto
指向协议名称的可选指针。如果为 NULL
,getservbyport 将返回端口与服务结构s_port的第一个服务条目。 否则,getservbyport会同时匹配端口和原型参数。
详情请参考:getservbyport 函数 (winsock. h)
代码展示:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <winsock2.h>
#include <ws2tcpip.h>
#include <windows.h> // 此头文件放在<winsock2.h>或<ws2tcpip.h>之后
#pragma comment(lib, "ws2_32.lib") //连接静态库int main(int argc, char** argv)
{
WSADATA wsaData; // 创建WSADATA的对象,存放socket版本号等信息int iResult; // 接收WSAStarup()函数的返回值struct servent* remoteServ;/* -------------------------*/// 注册套接字iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);//与操作系统确认支持的WinSock版本if (iResult != 0) {
printf("WSAStartup failed: %d\n", iResult);return 1;}short num = 1;printf("打印端口服务内容:\n");while (num < (unsigned short)-1) // 65535{
remoteServ = getservbyport(htons((u_short)num), "tcp"); // 服务端口,按网络字节顺序排列if (NULL == remoteServ);// printf("error %d ,please continue.\n", num);else {
printf("服务名: %s \n", remoteServ->s_name);printf("端口号: %d \n", ntohs((u_short)remoteServ->s_port)); //端口号按网络字节顺序返回printf("协议名: %s \n\n", remoteServ->s_proto);}num++;}/* -------------------------*/// 释放资源iResult = WSACleanup();if (iResult != 0) {
printf("WSACleanup failed: %d\n", iResult);return 1;}return 0;
}
输出效果: