windows网络编程 | getservbyname()与getservbyport()






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;
}

输出效果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我叫RT

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值