0. 服务结构 (struct servent)
服务结构用于存储或返回给定服务名称的名称和服务编号。
typedef struct servent {
char *s_name;
char **s_aliases;
#if ...
char *s_proto;
#if ...
short s_port;
#else
short s_port;
#endif
#else
char *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;
}
输出效果: