首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用socket.getservbyport找不到grpc服务器

使用socket.getservbyport找不到grpc服务器
EN

Stack Overflow用户
提问于 2020-06-15 13:32:40
回答 1查看 89关注 0票数 0

我的目标是与我的gRPC服务器(启用反射)与不熟悉服务器协议文件的客户端进行通信,因为我只需要使用端口号来查找服务器。

我正在尝试使用socket.getservbyport查找我的gRPC服务器,并得到“未找到端口/协议”异常。我知道我的服务器已在此端口上启动并运行。这里我漏掉了什么?

服务器端:

代码语言:javascript
运行
复制
from concurrent import futures

import logging

import grpc
from grpc_reflection.v1alpha import reflection

import helloworld_pb2
import helloworld_pb2_grpc


class Greeter(helloworld_pb2_grpc.GreeterServicer):

    def SayHello(self, request, context):
        return helloworld_pb2.HelloReply(message='Hello, %s!' % request.name)


def serve():
    server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
    helloworld_pb2_grpc.add_GreeterServicer_to_server(Greeter(), server)
    SERVICE_NAMES = (
        helloworld_pb2.DESCRIPTOR.services_by_name['Greeter'].full_name,
        reflection.SERVICE_NAME,
    )
    reflection.enable_server_reflection(SERVICE_NAMES, server)
    server.add_insecure_port('[::]:50051')
    server.start()
    server.wait_for_termination()

客户端:

代码语言:javascript
运行
复制
import socket


def find_service_name():

  for port in [25, 80, 50051]:

    print("Port: %s => service name: %s" % (port, socket.getservbyport(port)))


def run():

    try:
        find_service_name()
    except Exception as  e:
        print(e)

    with grpc.insecure_channel('localhost:50051') as channel:
        stub = helloworld_pb2_grpc.GreeterStub(channel)
        response = stub.SayHello(helloworld_pb2.HelloRequest(name='you'))
        print(response)


if __name__ == '__main__':
    logging.basicConfig()
    run()

输出:

代码语言:javascript
运行
复制
Port: 25 => service name: smtp
Port: 80 => service name: http
port/proto not found
message: "Hello, you!"
EN

回答 1

Stack Overflow用户

发布于 2020-06-15 13:53:42

Python的getservbyport是同名系统调用的包装器(参见cpython的relevant source code )。

系统调用(documentation here)查看服务数据库:

函数的作用是:返回数据库中与端口端口匹配的条目的服务结构。

getservbyport转到的services database就是(引用):

是一种纯ASCII码文件,提供了internet服务的友好文本名称与其底层分配的端口号和协议类型之间的映射。

因此,您看到的是您的服务器没有出现在服务数据库中。这并不奇怪,因为AFAIK没有将你的服务添加到数据库中。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62381901

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档