当前位置: 代码迷 >> 综合 >> windows网络编程 | getservbyname()与getservbyport()
  详细解决方案

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

热度:48   发布时间:2024-02-22 18:54:26.0

文章目录

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

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

  相关解决方案